查找算法(顺序+折半)

以下内容均依据于个人理解:通俗易懂

顺序查找

所谓顺序,就是按照顺序一个一个进行比对,可以采用顺序也可以逆序,把我们要查找的范围放在一个数组里面,可以从下标为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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章