以下内容均依据于个人理解:通俗易懂
顺序查找
所谓顺序,就是按照顺序一个一个进行比对,可以采用顺序也可以逆序,把我们要查找的范围放在一个数组里面,可以从下标为0的开始进行查找,也可以从下标为9 的开始查找(假定数组中一共有10个元素,数组下标一般从0开始计数)。
查找方式(假定从0号元素开始查找):我们要找的数字命名为key,顺序查找实际上就是用key与数组里面的值进行比较,直到找到与他相等的那个数字,然后返回这个数字的下标。
查找过程:首先用key与s[0]比较,看是否相等,相等就返回下标,跳出循环,不等继续寻找
再用key与s[1]比较,看是否相等,相等就返回下标,跳出循环,不等继续寻找
再用key与s[2]比较,看是否相等,相等就返回下标,跳出循环,不等继续寻找
......
再用key与s[9]比较,看是否相等,相等就返回下标,跳出循环,不等继续寻找
纵观之上,只有s的下标在变,其他都是在重复,那么采用循环是最好的方式,for(i=0;i<10;i++),循环体里面则放置以上一成不变的操作,比较是不是相等,如果等就找到了,就跳出(比较就是判断的过程,用if(s[i]==key)则跳出),如果最后都找遍了,也没找到,就说明已经跳出了循环,此时为了更有说服性,判断一下i是否还满足条件(i==10),不满足条件,告诉他没找到。
代码实现如下Java:仅仅为方法,通用操作在主函数,下面呈现
public static void Seq_Sea(int n,int[]s,int key) {
int i;
for(i=0;i<n;i++) {
if(s[i]==key)
{System.out.println(i+1);
return;}
}
if(i==10)System.out.println("很遗憾,没有要寻找的数");
return;
}
折半查找
折半查找要求:数组单调增,或者减。本文以增为例
所谓折半,就是每次只查找一半,那怎么找一半呢?我们先找到两头low,high,mid=(low+high)/2不就是一半了吗(值得注意的是low,high,mid均是指数组的下标)?
折半查找实质:不断缩小范围,实际上是每一次缩小上一次的一半。
过程:我们先确定好low,high,mid
我们先看看key和下标为mid(以下均简称为mid)的值是否相等,如果相等,那这不就是巧了吗,正好找到了
如果不等,我们需要比较一下(注意通过比较,我们来缩小范围)如果key>mid,说明要查找的在mid和high区域,此时我们就要把low换成mid+1,而high不变(为什么+1,因为我们是先比较的,已经确定mid不对,那么索性就从比它大一个的开始)。相反,如果key<mid,说明要查找的在low和mid区域,此时我们就要把high换成mid-1,而low不变(为什么-1,因为我们是先比较的,已经确定mid不对,那么索性就从比它小一个的开始),之后再去比较等不等,不等我们就再重复上述的缩小范围。
这种重复就是一种循环。
自画参考图(不喜勿喷,哈哈哈)
代码实现如下:
public static void Half_Sea(int n,int[]s,int key) {
int low=0,high=n-1;
while(low<high) {
int mid=(low+high)/2;
if(key==s[mid]) {
System.out.println(mid+1);
return;
}
if(key<s[mid]) {
high=mid-1;
}
if(key>s[mid]) {
low=mid+1;
}
}
System.out.println("很遗憾,没有要寻找的数");
return;
}
主函数为
public static void main(String args[]) {
Scanner input=new Scanner(System.in);
int []s=new int[10];
int key=0;
key=input.nextInt();
int i=0;
for(i=0;i<10;i++) {
s[i]=input.nextInt();
}
Seq_Sea(10,s,key);
Half_Sea(10,s,key);
}