二分查找

来源:互联网 发布:最优化pdf网盘 编辑:程序博客网 时间:2024/06/11 17:41

//递归法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;}
//用二分查找法找寻下届
与上界的查找相反。



0 0
原创粉丝点击