二分查找是**有序數組**查找的標準算法,時間複雜度 O(log n)。本文提供迭代與遞歸兩種完整 Java 實現,並解析邊界條件、中點計算溢出防護、未找到時的返回值約定。
Comparable 或基本類型)public static int binarySearch(int[] numbers, int target) {
int min = 0;
int max = numbers.length - 1;
while (min <= max) {
int mid = min + (max - min) / 2; // 防止 (min+max) 溢出
if (numbers[mid] == target) {
return mid; // 找到,返回索引
} else if (numbers[mid] < target) {
min = mid + 1; // 目標在右半部
} else {
max = mid - 1; // 目標在左半部
}
}
return -min - 1; // 未找到,返回負的插入點-1(Java Arrays.binarySearch 約定)
}
public static int binarySearch(int[] nums, int start, int end, int target) {
if (start > end) return -1; // 區間為空,未找到
int mid = start + (end - start) / 2;
if (nums[mid] < target) {
return binarySearch(nums, mid + 1, end, target);
} else if (nums[mid] == target) {
return mid;
} else {
return binarySearch(nums, start, mid - 1, target);
}
}
| 維度 | 迭代版 | 遞歸版 |
|---|---|---|
| 空間複雜度 | O(1) | O(log n) 棧幀 |
| 溢出防護 | min + (max-min)/2 | 同 |
| 未找到返回 | -min-1 (插入點編碼) | -1 (簡化) |
| 適用場景 | 生產環境、大數據量 | 教學、小數據量、函數式風格 |
public static > int binarySearch(T[] arr, T target) {
int lo = 0, hi = arr.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
int cmp = arr[mid].compareTo(target);
if (cmp == 0) return mid;
else if (cmp < 0) lo = mid + 1;
else hi = mid - 1;
}
return -lo - 1;
}
low + (high-low)/2 而非 (low+high)/2while (low < high) vs low <= high 需與更新邏輯配合if (start > end) return -1;二分查找是算法面試必考、工程庫廣泛使用的基石,徹底掌握其正確實現至關重要。