題目描述
給定已按升序排好序的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) 。
