关闭

二分查找

218人阅读 评论(0) 收藏 举报
分类:

//递归法
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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31220次
    • 积分:398
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:4篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论