搜尋是資料處理的基礎操作。本文介紹兩種經典演算法:循序搜尋(適用未排序資料)與 二分搜尋(要求資料已排序),並給出 C 風格函式實作與邏輯解析。
O(n)O(log n)[low, high],初始為 [0, n-1]。mid = (low + high) / 2。a[mid] 與目標值 x:
a[mid] > x → 目標在左半部,high = mid - 1。a[mid] < x → 目標在右半部,low = mid + 1。low > high(未找到)或找到為止。int binary_search(const float a[], int n, float x) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2; // 避免溢位
if (a[mid] == x) return mid;
else if (a[mid] > x) high = mid - 1;
else low = mid + 1;
}
return -1; // 未找到
}
b=d: 應為 b=d+1(或 low = mid + 1),否則陷入無窮迴圈。e=d 應為 high = mid - 1,否則區間無法正確收斂。int,找到回傳索引,失敗回傳 -1,符合慣例。| 演算法 | 最多比較次數 | 適用場景 |
|---|---|---|
| 循序搜尋 | 1,000,000 | 未排序、資料流、單次查詢 |
| 二分搜尋 | 20 | 靜態排序陣列、多次查詢 |
「二分搜尋是『分治法』教科書級範例:每次將問題規模減半,對數級效能源於資料的有序性。」