最详细!!解析折半查询一个数是否在已知数组中

Posted 倾卿亲君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最详细!!解析折半查询一个数是否在已知数组中相关的知识,希望对你有一定的参考价值。

目录

折半查询一个数是否在数组中

1、选择哪个元素作为middle

2、如何查询

3.源代码

4、运行结果


折半查询一个数是否在数组中

大家好,五一假期来到了最后一天,想必大家一定度过了一个愉快的假期。假期的时间总是过得很快,明天就是该上课的上课,该搬砖的搬砖了。

今天的小操作是折半查询一个数是否在数组中,首先我们先假定一个数组{a0,a1,a2,a3,a4,a5,a6,a7,a8,a9},我们要查询的数是a2,有的朋友就要问了:“我这一眼就看到了他在里面啊,还需要折半找嘛?”我们可以一眼看出来的东西,电脑却不行,这一点我就觉得电脑比我们人脑笨,但是!!!如果数组的元素不只是十个,是一百个一千个一万个我们又是否也可以像刚刚一样一眼看出来呢,我想大多数朋友和我一样不能做到一眼就找到,但是电脑却可以在几秒钟内找见,这又是电脑超越人脑速度的一种情况。现在我们来看看折半查询的原理图。

1、选择哪个元素作为middle

   

2、如何查询

在检索过程中还需要定义一个变量count,每检索一次count自加一,折半查询在自身长度一半的次数下就会找到,也就是说查询次数超过a.lenth/2,即count>a.lenth/2所检索的数字就不在已知数组中。

3.源代码

/*
import java.util.Arrays;//java排序方法导入
public class Experiment01{
	public static void main(String[] args){
		int a[] = {12, 15, 235, 25, 63, -98, 23, 45};
		int n = a.length;
		int start = 0;
		int end, middle;
		Arrays.sort(a);
		for(int i = 0;i < a.length;i++){
			System.out.print(a[i] + ",");
		}
	} 
}
*/
import java.util.Scanner;
public class Experiment01{
	public static void main(String[] args){
		int a[] = {12, 15, 235, 25, 63, -98, 23, 45, 52};
		int N = a.length;
		int start = 0;
		int end, middle;
		System.out.println("数组从小到大的顺序为:");
		for(int i = 0;i < N;i++){//冒泡排序将数组按顺序排好
			for(int j = i + 1;j < N;j++){
				if(a[i] > a[j]){
					int t = a[i];
					a[i] = a[j];
					a[j] = t;
				}
			}
			if (i < N - 1){
				System.out.print(a[i]+ ",");
			}
			if (i == N - 1){
				System.out.print(a[i]);
			}
		}
		Scanner sc = new Scanner(System.in);
		System.out.println();
		System.out.println("请输入一个需要查找的整数:");
		int n = sc.nextInt();//接收一个输入的整数
		int count = 0;//初始化
		end = N;//初始化
		middle = (start + end) / 2;//初始化
		if(n == a[middle]){//如果运气很好查找的整数就在正中间,就直接输出
			System.out.println(n + "在数组中!且在数组中间middle!!");
			System.out.println("在数组中的位置为:" + (middle+1)+ '位');
			System.out.println("查询次数为:" + count+ '次');
			}
			else{
				while(n != a[middle]){
					if(n < a[middle]){//如果比中间的小,选前半段
						end = middle;
							}
					else if(n > a[middle]){//如果比中间的大,选后半段
						start = middle;
							}
					middle = (start + end) / 2;//重新确定正中间的数
					count++;//每重新确定middle便加一
					if(count > N / 2){//
								break;
								}
							}
				if(count > N / 2){//经过(“数组长度”/2)次一定可以找到其中的任意一个元素
					System.out.println(n + "不在数组中!");
					System.out.println("查询次数为:" + count+'次');
					}
				else{
					System.out.println(n + "在数组中!");
					System.out.println("在数组中的位置为:" + (middle+1)+ '位');
					System.out.println("查询次数为:" + count+ '次');
					}
			 }
	  }
}

在这串代码中我插入许多新功能,比如知到是在第几次查询到的这个数,这个被查到的数的位置等。同时我也给出了两种排序代码,一种是数据结构中的冒泡排数,一种是通过Java包导入直接排序”import java.util.Arrays“我已经加以注释供大家参考。

4、运行结果

好啦,五一假期的最后一天我的好好休息,写文章到这么晚,希望大家点个赞鼓励鼓励,同时以上内容有任何问题欢迎大佬指点,我会仔细查看并修改,谢谢大家!!!晚安啦!

以上是关于最详细!!解析折半查询一个数是否在已知数组中的主要内容,如果未能解决你的问题,请参考以下文章

有15个数存放在一个数组中,输入一个数,要求用折半法找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。

经典折半查找算法

通过折半查找,查找某一数组中是否存在某个数

c语言折半查找法

算法知识常用算法详解丨二分查找法(折半查找)

往有序数组中插入数