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

目录

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

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、运行结果

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

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾卿亲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值