查找算法(順序+折半)

以下內容均依據於個人理解:通俗易懂

順序查找

所謂順序,就是按照順序一個一個進行比對,可以採用順序也可以逆序,把我們要查找的範圍放在一個數組裏面,可以從下標爲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);
}


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