// 递归版本
int binary_search(const int arr[], int start, int end, int key) {
if (start > end)
return -1;
int mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法
if (arr[mid] > key)
return binary_search(arr, start, mid - 1, key);
if (arr[mid] < key)
return binary_search(arr, mid + 1, end, key);
return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於
}
// while循环
int binary_search(const int arr[], int start, int end, int key) {
int mid;
while (start <= end) {
mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法
if (arr[mid] < key)
start = mid + 1;
else if (arr[mid] > key)
end = mid - 1;
else
return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於
}
return -1;
}
二分查找法在算法家族大类中属于“分治法”,分治法基本都可以用递归来实现的。
最差时间复杂度 O(log n)
最优时间复杂度 O(1)
平均时间复杂度 O(log n)