最详细!!解析折半查询一个数是否在已知数组中
Posted 倾卿亲君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最详细!!解析折半查询一个数是否在已知数组中相关的知识,希望对你有一定的参考价值。
目录
折半查询一个数是否在数组中
大家好,五一假期来到了最后一天,想必大家一定度过了一个愉快的假期。假期的时间总是过得很快,明天就是该上课的上课,该搬砖的搬砖了。
今天的小操作是折半查询一个数是否在数组中,首先我们先假定一个数组{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函数输入。