二分查找边界值

二分查找

条件:数组 && 有序

对于二分查找某一个值,在logN 复杂度完成。

对于二分查找边界值,要注意 low,high,mid的取值

// 二分查找上下界,小标从0开始
/* 例如对于数组 {1,3,5,7,12,56,78},找小于7的第一个值,或大于7的第一个值 */

// 查找大于key的第一个值
int binary_search_upperbound(int a[],int n,int key){
	
	if(key>=a[n-1]) return -1;//如果是大于等于key的第一个值,则此处改为>

	int low,high,mid;
	low=0;
	high=n-1;
	mid=(low+high)/2;
	while(low<high){
		if(key<a[mid])//如果是大于等于key的第一个值,则此处改为<=
			high=mid;
		else
			low=mid+1;
		mid=(low+high)/2;
	}
	cout<<(mid==high? "YES":"No")<<endl;// mid是等于high的
	return a[mid];
}

// 查找小于key的第一个值
int binary_search_lowerbound(int a[],int n,int key){
	if(key<=a[0]) return -1;//如果是大于等于key的第一个值,则此处改为<
	int low,high,mid;
	low=0;
	high=n-1;
	mid=(low+high+1)/2;
	while(low<high){
		if(key>a[mid])//如果是大于等于key的第一个值,则此处改为>=
			low=mid;
		else
			high=mid-1;
		mid=(low+high+1)/2; //如果不加1,会有死循环
	}
	cout<<(mid==low? "YES":"No")<<endl;
	return a[mid];
}

void main(){
	int a[]={1,3,5,7,9,12,43,56,67,78};
	cout<<binary_search_upperbound(a,10,3)<<endl;
	cout<<binary_search_lowerbound(a,10,56)<<endl;

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值