给定已按升序排好序的n个元素a[0,n-1],现要在这n个元素中找到一特定元素x。
分析:
如果n=1即只有一个元素,则只要比较这个元素和x就可以确定x是否在表中。
设在a[l:r]中找x,m=(l+r)/2
(0)如果x==a【m】,则找到;
(1)如果x<a【m】,则继续在a【l,m-1】中找x即可;
(2)如果x>a【m】,则继续在a【m+1,r】中找x即可;
子问题答案就是大问题的答案
//递归
int BiSearch(Type a[],const Type &x,int l,int r)
{
if(r>=l)
{
int m=(l+r)/2;
if(x==a[m]) return m;
else if (x<a[m])
return BiSearch(a,x,l,m-1);
else
return BiSearch(a,x,m+1,r);
}
else return -1;
}
//非递归
int BiSearch(Type a[],const Type& x,int l,int r)
{
while(r>=l)
{
int m=(r+l)/2;
if(x==a[m]) return m;
if(x<a[m]) r = m-1;
else l = m+1;
}
return -1;
}
非递归算法复杂度分析:
每执行一次while循环,待搜索数组的大小减小1/2.在最坏情况下,while循环被执行了O(logn)次。因此算法在最坏情况下的时间复杂度为O(logn)。