二分查找(Binary Search)是一種在有序數組中查找目標元素的查找演算法。它的基本思路是:在數組的中間元素開始,如果該元素等於目標元素,則查找成功;如果該元素大於目標元素,則在左半部分繼續查找;如果該元素小於目標元素,則在右半部分繼續查找。這樣一直重覆這個過程,直到查找成功或者查找失敗。 ...
二分查找(Binary Search)是一種在有序數組中查找目標元素的查找演算法。它的基本思路是:在數組的中間元素開始,如果該元素等於目標元素,則查找成功;如果該元素大於目標元素,則在左半部分繼續查找;如果該元素小於目標元素,則在右半部分繼續查找。這樣一直重覆這個過程,直到查找成功或者查找失敗。
基本步驟:
-
設置兩個指針,left 和 right,分別指向數組的第一個元素和最後一個元素。
-
計算中間索引,mid = (left + right) / 2。
-
如果該索引上的元素等於目標元素,則查找成功,返回該索引。
-
如果該索引上的元素大於目標元素,則說明目標元素在左半部分,將 right 指針移動到 mid-1。
-
如果該索引上的元素小於目標元素,則說明目標元素在右半部分,將 left 指針移動到 mid+1。
-
重覆步驟2-5,直到查找成功或者 left > right。
-
如果查找失敗,則返回 -1。
二分查找的時間複雜度是 O(log n),比順序查找和線性查找的時間複雜度更優秀。但是,需要註意的是,二分查找只能用於有序數組。
JavaScript 實現二分查找可以使用遞歸或迭代兩種方法。
這是一個使用遞歸實現二分查找的示例代碼:
function binarySearch(arr, target, left = 0, right = arr.length - 1) {
if (left > right) return -1;
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] > target) {
return binarySearch(arr, target, left, mid - 1);
} else {
return binarySearch(arr, target, mid + 1, right);
}
}
這是一個使用迭代實現二分查找的示例代碼:
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
在上面的代碼中,我們可以看到,遞歸和迭代兩種方法都是基於同樣的思想,不斷地將查找範圍縮小,直到找到目標元素或者縮小到不可能找到目標元素的範圍。
兩種方法的區別在於,遞歸方法是使用函數調用棧來保存狀態,而迭代方法是使用迴圈和變數來保存狀態。對於大部分情況來說,迭代方法更加高效,因為它避免了函數調用棧的開銷。
兩種方法都需要註意的是數組是有序的,且需要先確定好左右邊界。
這裡的代碼只是一個簡單的二分查找示例,在實際使用中,還需要根據具體需求進行調整和優化。
作者:yuzhihui
出處:http://www.cnblogs.com/yuzhihui/ 聲明:歡迎任何形式的轉載,但請務必註明出處!!!