二分查找要求序列單調;三分查找針對凸性(單峰)函數,將區間三等分,通過比較兩個中間點值,縮小搜索範圍至1/3,常用於三元搜索求極值。
#include <stdio.h>
#define M 10
int ternary_search(int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid1 = left + (right - left) / 3;
int mid2 = right - (right - left) / 3;
if (arr[mid1] == target) return mid1;
if (arr[mid2] == target) return mid2;
if (target < arr[mid1]) right = mid1 - 1;
else if (target > arr[mid2]) left = mid2 + 1;
else { left = mid1 + 1; right = mid2 - 1; }
}
return -1;
}
int main() {
int a[M] = {1,2,3,4,5,6,7,8,9,10};
int x; printf("Input target: "); scanf("%d", &x);
int pos = ternary_search(a, M, x);
if (pos >= 0) printf("Found at index %d\n", pos);
else puts("Not found");
return 0;
}
| 特性 | 二分查找 | 三分查找 |
|---|---|---|
| 適用序列 | 單調遞增/遞減 | 凸函數/單峰函數(先升後降或先降後升) |
| 分割方式 | 二等分 | 三等分 |
| 比較次數 | 每輪1次 | 每輪2次 |
| 時間複雜度 | O(log₂ n) | O(log₃ n) ≈ O(log₂ n) |
| 常見用途 | 精確查找/邊界定位 | 實數域極值搜索/三元搜索 |
100次或直到區間< 1e-9。