4 回答

TA貢獻1815條經驗 獲得超13個贊
您的左/右前進是向后的。當當前位置的元素mid小于目標時,則需要搜索右半部分,當當前mid位置的元素大于目標(else塊)時,則需要搜索左半部分。
您發現正確的唯一原因5是mid在第一次迭代中碰巧是正確的。
else if切換和塊中的語句else。
else if (array[mid] < target) { left = mid + 1; }
else { right = mid - 1; }
或者反轉條件的比較意義else if。
else if (array[mid] > target) { right = mid - 1; }
else { left = mid + 1; }

TA貢獻1877條經驗 獲得超6個贊
您的程序存在一些邏輯問題。
第一個問題是使用
else
包含語句if
的條件return
。由于該方法會return
在if
條件為時執行true
,因此添加 anelse
是沒有用的。需要使用 來else
選擇兩個選項中的一個(即不是兩者都選擇)。使用return
帶有第一個選項的語句后,您已經禁止第二個選項。right
第二個問題是和變量的計算放錯了位置left
。邏輯應該是:target
如果大于 處的數字,則忽略左半部分mid
,為此,只需left
在 之外前進一位即可mid
;否則(即,如果target
大于less
處的數字),通過向后mid
移動一個位置來忽略右半部分。right
工作方案如下:
public class BinarySearchDemo {
public static void main(String[] args) {
int arr[] = { 1, 5, 23, 111 };
System.out.println(binarySearch(arr, 23));
System.out.println(binarySearch(arr, 20));
}
public static int binarySearch(int[] array, int target) {
int left = 0;
int right = array.length - 1;
while (left <= right) {
int mid = left + (right - 1) / 2;
if (array[mid] == target) {
return mid;
}
if (array[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}
輸出:
2
-1

TA貢獻1775條經驗 獲得超8個贊
問題是當你更新left和right. 您正在錯誤的 if 語句中更新它們。
當 時array[mid] < target,您想要更新left指針并在右側子數組中搜索,反之亦然。
所以你的更新應該是這樣的:
else if (array[mid] < target) { left = mid + 1; }
else { right = mid - 1; }

TA貢獻1827條經驗 獲得超4個贊
想添加評論,但還不能評論
使用正確的邏輯修復代碼后(如上面的答案),這里有一些需要改進的代碼:
不要這樣做:int mid=(left+right)/2;
這樣做:int mid = low + ((high - low) / 2);
或這個int mid = (low + high) >>> 1;
添加回答
舉報