又稱折半搜尋,針對已排序序列,每次以中點比較,將搜尋範圍縮減一半,時間複雜度 O(log n)。
| 優點 | 缺點 |
|---|---|
| 比較次數少、查找快、平均效能佳 | 要求有序、插入刪除困難(需維持順序) |
適用場景:不常變動但頻繁查詢的有序列表。
min=0, max=length-1。mid = (min + max) / 2。arr[mid] 與目標值:min = mid + 1;max = mid - 1。min > max(查無此值,回傳 -1)。
public class BinarySearch {
public static int binarySearch(int[] arr, int target) {
if (arr == null) return -1;
int min = 0, max = arr.length - 1;
while (min <= max) {
int mid = (min + max) >>> 1; // 無符號右移避免溢位
if (arr[mid] < target) min = mid + 1;
else if (arr[mid] > target) max = mid - 1;
else return mid;
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 5, 6, 7, 8, 9, 23, 34};
System.out.println(binarySearch(arr, 5)); // 3
System.out.println(binarySearch(arr, 23)); // 8
System.out.println(binarySearch(arr, 0)); // -1
System.out.println(binarySearch(arr, 35)); // -1
}
}
>>> 1 而非 / 2 避免 min+max 溢位(雖 Java int 正數相加不會溢位為負,但屬良好習慣)。min <= max 確保單一元素也能檢查。