題目描述
給定已按升序排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定元素x。
題目分析
二分搜索算法(折半查找法)是運用分治策略的典型例子。
滿足分治法的4個適用條件。很顯然此問題分解出的子問題相互獨立,即在a[i]的前面或后面查找x是獨立的子問題,因此滿足分治法的第四個適用條件。
算法實現
#include <stdio.h> int binarySearch(int a[], const int& x, int n) { int left=0, right=n-1; while (left <= right) { int middle = (left+right)/2; if (x==a[middle]) { return middle; } if (x > a[middle]) { left = middle+1; } else { right = middle-1; } } return -1; } int main() { int a[] = {1,2,5,7,8,10}; printf("%d\n",binarySearch(a,8,6)); return 0; }
復雜度分析
每執行一次算法的while循環, 待搜索數組的大小減少一半。因此,在最壞情況下,while循環被執行了O(logn) 次。循環體內運算需要O(1) 時間,因此整個算法在最壞情況下的計算時間復雜性為O(logn) 。