二分查詢演算法(遞迴 非遞迴)

2021-08-19 07:51:33 字數 2912 閱讀 5402

二分查詢

( binary search)

先來個比較官方的解釋:

二分搜尋(英語:

binary search

),也稱折半搜尋(英語:

half-interval search

)、對數搜尋(英語:

logarithmic search

),是一種在有序陣列中查詢某一特定元素的搜尋演算法。

搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的

那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

- from 

維基百科

以上介紹參考自維基百科(

psgoogle

,多上wikipedia

,相信我,你會愛上它們的,哈哈~)

好,看完比較正式的解釋如果不太理解,沒關係,拿圖來說話:

二分法首先考察中間元素

a[mid]

,如果該值是我們要找的值,那好極了,直接找到了;如果不是的話,由於我們已經知道陣列是排好序的(二分法要求待查詢的陣列是有序的,本例假設是公升序的,降序其實是一樣的),那就看目標值

target

和a[mid]

的關係是怎樣的:如果

a[mid] > target

則說明目標值

target

如果存在的話一定在

a[mid]

的左側,因為左側都比

a[mid]

小;如果

a[mid] < target

則說明目標值如果存在的話一定在

a[mid]

的右側,因為右側都比

a[mid]

大。因為

a[mid]

處在陣列的中間位置,所以它的左側或者右側都是陣列的一半,這樣每一次我們通過

a[mid]

和target

的比較就可以排除掉一半的資料。最後只有兩種情況,要麼我們找到了目標值,要麼我們排除了所有資料沒有找到目標值。

由此看來,在處理已排序資料的查詢工作時,二分查詢法顯然效率高於線性查詢法。這種優勢在資料量越大的時候越明顯。

比如說,現在有序陣列中含有

100萬個資料,我們要求查詢特定元素。如果使用線性查詢法,我們必須對這一

100萬個資料依次考察以確定出目標元素是不是存在,最好的情況是目標元素在陣列的第乙個位置

a[0]

,這樣只要一次就查詢到目標元素了,最壞情況是目標元素在陣列的最後

a[999999]

,這樣我們就得比較

100萬次才能知道目標元素到底在不在,平均下來看的話也需要50

萬次比較。而如果使用二分查詢法,我們大約做20

次比較就可以知道目標元素是不是存在於陣列中了。50萬

vs 20

!是不是很驚悚?為了達到目的我們可以使用不同的演算法,但是這些演算法之間的差異真的很大!

在資料量越大的時候二分法的優勢越明顯。

/**

* */

package test2;

/** * @author lee

* */

public class binarysearch ;

int target = 12;

int index = binarysearch1(a, 0, a.length-1, target);

if(index > -1)

else

} /**

* 遞迴實現二分查詢

* @param a 已排序陣列(假設是從小到大)

* @param l 陣列左邊界

* @param r 陣列右邊界

* @param target 要查詢的值

* @return 要查詢的值在陣列中的位置,如果沒找到則返回-1

* @author lee 2023年3月12日 下午7:05:43

*/static int binarysearch1(int a,int l,int r,int target)

//中間的值比目標值大,則在左半邊繼續查詢

else if(a[mid] > target)

//找到了,把找到的情況放在最後是因為多數情況下中間值不是大於就是小於,這樣做可以節省操作

else

} return -1;

} /**

* 非遞迴實現二分查詢

* @param a 已排序陣列(假設是從小到大)

* @param l 陣列左邊界

* @param r 陣列右邊界

* @param target 要查詢的值

* @return 要查詢的值在陣列中的位置,如果沒找到則返回-1

* @author lee 2023年3月12日 下午7:05:43

*/static int binarysearch2(int a,int l,int r,int target)

//中間的值比目標值大,則在左半邊繼續查詢

else if(a[mid] > target)

//找到了,把找到的情況放在最後是因為多數情況下中間值不是大於就是小於,這樣做可以節省操作

else

} return -1;

}}

二分查詢演算法(遞迴 非遞迴)

二分查詢是針對有序序列來說的,在有序序列中使用二分查詢能大大提高查詢效率。首先確定整個查詢區間的中間位置 mid 用待查關鍵字key值與中間位置的關鍵字值進行比較 若相等,則查詢成功 若大於,則在後 右 半個區域繼續進行折半查詢 若小於,則在前 左 半個區域繼續進行折半查詢 對確定的縮小區域再按折半...

二分查詢(遞迴 非遞迴)

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。使用條件 查詢序...

二分查詢演算法 遞迴 非遞迴實現

package sorttest 名稱 binarysearch 功能 實現了折半查詢 二分查詢 的遞迴和非遞迴演算法.說明 1 要求所查詢的陣列已有序,並且其中元素已實現comparable介面,如integer string等.2 非遞迴查詢使用search 遞迴查詢使用searchrecurs...