對分查找 = 二分查找 = Binary Search。這是同一算法的不同中文譯名,無任何技術差異。
無論叫什麼名字,核心邏輯永遠是:
int binary_search(const int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1; // 未找到
}
| 變體名稱 | 目標 | 關鍵邏輯差異 |
|---|---|---|
| Lower Bound | 第一個 ≥ target 的位置 | arr[mid] < target 時 left = mid + 1,否則 right = mid |
| Upper Bound | 第一個 > target 的位置 | arr[mid] <= target 時 left = mid + 1,否則 right = mid |
| 查找首次出現 | 目標值第一個下標 | 找到後 right = mid - 1 繼續向左收斂 |
| 查找最後出現 | 目標值最後一個下標 | 找到後 left = mid + 1 繼續向右收斂 |
| 旋轉數組搜索 | 旋轉有序數組中查找 | 判斷哪半有序,再決策去哪半 |
left = mid 或 right = mid 且循環條件為 left < right)。mid = (left + right) / 2,修正為 left + (right - left) / 2。名字不重要,掌握「有序 + 分半 + 收斂」的核心模型,熟練寫出正確的邊界控制代碼,並能靈活變體解決「第一個/最後一個/區間邊界」等實際問題,才是二分查找 (對分/折半) 的真諦。