二分查詢
( 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...