刘汝佳 紫书提供方法:
//正确答案在[x,y)区间之内,即不会包括y。
//这种方法老是两个细节搞不顺,如下标注
int bsearch(int* a, int x,int y,int test)
{
int m;
while(x<y) //1.这里判断条件为什么不是x<=y(因为不包括y,所以x==y时就说明区间内没有正确答案了
{
m = (x+y)/2;
if(a[m]==test)
return m;
else if(a[m]>test)
y=m; //2.为什么不是y=m-1,=(因为区间y不可能是正确答案,m此时已经断定不是正确答案,但是m-1有可能是正确答案,所以不能赋值m-1)
else
x=m+1;//这里加一是因为求中位数m除2时会取较小值,如果答案为m+1,那么不加一就永远得不到答案。
}
return -1;//没有正确答案时返回-1
}
下面是一种逻辑清晰通顺的实现写法(只有两个小细节不一样,但理解起来很自然)
以后只用这个
//正确答案区间在[x,y],两个赋值语句形式相同
int bsearchWithoutRecursion(int array[], int low, int high, int target)
{
while(low <= high)
{
int mid = (low + high)/2;
if (array[mid] > target)
high = mid - 1;
else if (array[mid] < target)
low = mid + 1;
else //find the target
return mid;
}
//the array does not contain the target
return -1;
}
这篇博客介绍了刘汝佳关于已排序数组的二分查找方法,提供了一种逻辑清晰、易于理解的实现方式。
596

被折叠的 条评论
为什么被折叠?



