[英]Correct way of Binary Search Algorithm
我剛剛了解了二分搜索算法,並嘗試實現它。 我已經使用了一些測試用例,它似乎工作正常。 但是,當我查看 GeeksforGeeks 時,他們處理索引的方式有很多不同。 任何人都可以闡明我的實施是否良好。 如果沒有,它怎么會失效?
這是我的代碼:
static int binarySearch(int arr[], int i, int r, int x) {
if(r > 1) {
int middle = r/2;
if(arr[middle] == x) {
return middle;
}
if(arr[middle] > x) {
return binarySearch(arr, i, middle, x);
}else {
return binarySearch(arr, middle, r+1, x);
}
}
return -1;
}
假設我們的 function 將對子arr[l..r]
(包括)進行二分搜索。 在這里, r - l + 1
是此子陣列的長度,當它不是正數時(或r < l
)並返回 -1。
你知道,我們總是制作兩個(幾乎)等長的子數組。 所以, middle = r/2
是不正確的, middle = (l + r) / 2
是正確的。 新的子數組是arr[l..middle-1]
和arr[middle+1..r]
。 我們在檢查子數組的中間元素后划分子數組,所以這兩個子數組不應該包含中間索引,如您所見。
現在,我們可以重寫您的代碼。
static int binarySearch(int arr[], int l, int r, int x) {
if (r >= l) {
int middle = (l + r) / 2; //int middle = l + (r - l) / 2; for avoiding integer overflow
if(arr[middle] == x)
return middle;
if (arr[middle] > x)
return binarySearch(arr, l, middle - 1, x);
else
return binarySearch(arr, middle + 1, r, x);
}
return -1;
}
這是二進制搜索算法的非遞歸版本。 通常,它可以工作得稍微快一些。
static int binarySearch2(int arr[], int l, int r, int x) {
while (r >= l) {
int middle = (l + r) / 2; //int middle = l + (r - l) / 2; for avoiding integer overflow
if (arr[middle] == x)
return middle;
if (arr[middle] > x)
r = middle - 1;
else
l = middle + 1;
}
return -1;
}
在調用這些函數之前不要忘記對數組進行排序。 假設n
是給定數組的長度。 對於從 0 開始的 arrays,調用函數的正確形式是:
binarySearch(arr, 0, n - 1, x);
和
binarySearch2(arr, 0, n - 1, x);
對於基於 1 的 arrays,調用函數的正確形式是:
binarySearch(arr, 1, n, x);
和
binarySearch2(arr, 1, n, x);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.