二分搜索算法是运用分治策略的典型例子。给定己排好府的 n个元素a10:n-1],现要在
这n个元素中找出一特定元素3。首先较容易想到的是用顺序搜索方法,逐个比较a10:1-1]
中元素,直至找出元素,或搜索遍整个数组后确定,不在其中。这个方法没有很好地利用n
个元素已排好序这个条件,因此在最坏情况下,顺序搜索方法需要 O(1次比较。
二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏情況下用 O(ogn)
时间完成搜索任务。二分搜索算法的基本思想是,将n个元素分成个数大致相同的两半,取
aln/21与x 作比较。如果x-aln/2],则我到x,算法终止;如果x<ain/2],则只在数组。 的左
半部继续搜索 3;如果saln/2],则只在数组a 的右半部继续搜索x。具体算法可描述如下:
template<class Type>
int BinarySearch(Type a[],const Type& x,int n)
{
//在a[0]<=a[1]<=...<=a[n-1]中搜索x
//找到x时返回其在数组中的位置,否则返回-1
int left=0; int 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;//未找到x
}
容易看出,每执行一次算法的 while 福环,待搜索数组的大小减小一半。因此,在取多
情况下,whie 循环被执行了 0(o 2)次。循环体肉运算需要 Q()时间,因此整个算法在最动
情况下的计算时间复杂性为 Ologn)。
三分搜索算法的思想易手理解,但是要写一个正确的二分搜索算法也不是一件简单的
事。Knuth在他的著作 “The Art of Coroputer Prograraming : Sorting and Searching”中提到,
第一个二分搜素算法早在 1946年就出现丁,但是第一个完全正确的二分搜索算法直到1946年才出现。
总结后期还会更新,课程太紧后面会改进这篇文章,还有所有需要改进的文章