二分法适合数据量很大的数据的查找,该算法要求:该组数据是有序的。
主要思想是:(设查找的数组区间为array[low,high])
(1)确定该期间的中间位置K
(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。其算法的时间复杂度为log(n).
刚写二分法时,考虑片刻,写下如下代码(注意:有bug):
int bisection(int *p,int size,int n)
{
int i,j,k;
i=0;
j=size-1;
k=(i+j)/2;
while(i<j)
{
if(p[k]>n)
{
j=k;
k=(i+j)/2;
}
else if(p[k]<n)
{
i=k;
k=(i+j)/2;
}
else
return k;
}
return -1;
}
测试用例
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b = bisection(a,10,5);
printf("%d",b);
}
测试结果,似乎一切正常,但是,但测试到数组的最后一个元素时,程序进入死循环,断点调试查看,发现当程序运行到i=8,j=9时,k=(i+j)/2一直为8,导致死循环。是一个典型的边界条件未满足导致的bug。
如下修改代码:
int bisection(int *p,int size,int n)
{
int i,j,k;
i=0;
j=size-1;
k=(i+j)/2;
while(i<j)
{
if(p[k]>n)
{
j=k-1; //修改这里
k=(i+j)/2;
}
else if(p[k]<n)
{
i=k+1; //修改这里
k=(i+j)/2;
}
else
return k;
}
return -1;
}