您的位置:首页 > 其它

二分查找

2015-11-21 18:11 281 查看
//递归法
int BinarySearch(int a[], int b, int e, int x)
{
if (b > e){
return -1;
}

int m = b + ((e - b)>>1);//middle= (left+right)>>1; 这样的话left与right的值比较大的时候,其和可能溢出。
if (x < a[m]){
return BinarySearch(a, b, m-1, x);
}
if  (x > a[m]){
return BinarySearch(a, m+1, e, x);
}

return m;

}
//循环法
int BinarySearch2(int a[], int b, int e, int x)
{
if (b > e){
return -1;
}

while (b <= e){
int m = (b+e)/2;
if (x < a[m]){
e = m-1;
}
else if (x > a[m]){
b = m+1;
}
else {
return m;
}
}
return -1;
}
二分查找需要判断三种情况: 大于,小于,等于。只要找到与目标值相等的值就结束了。二分查找需要注意的地方:   1.递归或循环时,退出的条件,当 begin > end时,才退出。注:当begin = end时,还需要取平均值mid,再比较一次2.mid 的获取: mid = begin + (end - begin)/2。注: mid的获取有两种情况: (end - begin)/2 会取下界;mid也可以取上界,(end-begin+1)/2;int BSearchUpperBound(int a[], int b, int e, int x){if (b > e || x >= a[e]){return -1;}int m = (b+e)/2;while (b < e){if (x < a[m]){e = m;}else{b = m+1;}m = (b+e)/2;}return m;}
//用二分查找法找寻上届
二分法查找上界需要判断两种情况:大于,不大于。算法需要一直二分,直到begin=end时,此时这个位置的值就是所要查找的上界。
1.循环条件:begin<end,当begin>=end时,退出。
2.mid = begin+(end-begin)/2,当a[mid] > 目标值x时,end = mid;否则,begin = mid+1;
3.mid的获取只能 mid=begin+(end-begin)/2;若mid=begin+(end-begin+1)/2的话,在下面这个情况会死循环: 目标值x=10,在{10,11}这求x的上界。
 
int BSearchLowerBound(int a[], int b, int e, int x){if ( b>e || x <= a[b] ){return -1;}int m = b+ ((e-b+1)>>1);while(b < e){if ( a[m] < x){b = m;}else{e = m-1;}m = b+((e-b+1)>>1);}return m;}
//用二分查找法找寻下届
与上界的查找相反。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: