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