您的位置:首页 > 其它

二分法查找

2016-04-05 19:12 225 查看
二分法适合数据量很大的数据的查找,该算法要求:该组数据是有序的。

主要思想是:(设查找的数组区间为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: