什么是二分法查找
二分查找也稱折半查找(BinarySearch),它是一種采用分治策略的算法,他將問題分解為規模更小的的子問題,分而治之,逐一解決。采用二分法查找的前提條件是:要求線性表必須采用順序存儲結構,而且表中元素按關鍵字有序排列。
二分法查找使用場景
二分法查找適用於數據量較大時,但是數據需要先排好順序。對於我們很多人來說,還是用於面試……
二分法查找算法設計
設排序元素序列(升序)存儲在 arrs 數組,begin、end 指定查找范圍,keyword 是指定查找的值。
- 每次從子序列中間 mid 開始比較
mid = (begin + end) / 2,如果 keyword 與 arrs[mid] 元素相等,則查找成功;否則根據根據 keyword 大小縮小查找范圍,若 keyword 較小,則繼續在子序列前半段begin ~ (mid - 1)查找;反之在后半段(mid - 1) ~ end查找。 - 重復 1,直到查找成功,當 begin、end 表示范圍失效時,返回 -1 表示查找失敗。
時間復雜度
最快:O(1)
最壞:O(logn)
平均時間復雜度:O(logn)
Java 實現
循環實現
/**
* 二分查找
* @param arr
* @param value
* @return -1 則查找失敗
*/
public static int binarySearch(int[] arr, int value) {
int begin = 0;
int end = arr.length - 1;
int mid;
while (begin <= end) { // 邊界有效
mid = (begin + end) / 2; // 計算中界
if (arr[mid] == value) { // 如果兩個值相等
return mid;
} else if (value > arr[mid]) { // value 較小
begin = mid + 1; //
} else { // value 較大
end = mid - 1;
}
}
return -1;
}
遞歸實現
/**
* 遞歸實現二分法查找
* @param arr [排序完成的線性表]
* @param value [查找的元素]
* @param begin [從第幾個元素開始]
* @param end [數組長度 - 1]
* @return -1 則查找失敗
*/
public static int binarySearch(int[] arr, int value, int begin, int end) {
int mid = (begin + end) / 2;
// 無效邊界
if (begin > end) {
return -1;
}
if (arr[mid] == value) {
return mid;
} else if (value > arr[mid]) { // value 較小
begin = mid + 1;
} else {
end = mid - 1;
}
return binarySearch(arr, value, begin, end);
}
