二分查找(找第一个大于k的位置)

没事写了写怎么实现的二分的小操作

#include <iostream>
using namespace std;

const int N = 10000;

int a[N],b[N];

void Sort(int l,int r,int a[]){	//归并 
	
	int mid = (l+r) >> 1;
	if(l == r) return ;
	
	Sort(l,mid,a);
	Sort(mid+1,r,a);
	
	int i = l,t = l,j = mid+1;
	while(i <= mid && j <= r){
		
		if(a[i] < a[j]){
			b[t++] = a[i++];
		}else
			b[t++] = a[j++];
	}
	
	while(i <= mid) b[t++] = a[i++];
	while(j <= r) b[t++] = a[j++];
	
	for(i = l;i<=r;i++) a[i] = b[i];
}

int search(int l,int r,int k){		//标准查找,找不到返回-1 
	
	while(l <= r){
		int mid = (l+r) >> 1;
		
		if(a[mid] == k) return mid;
		else if(a[mid] > k) r = mid-1;
		else l = mid+1;
	}
	
	return -1;
}

int lower_search(int l,int r,int k){
	
	int n = r;
	
	while(l <= r){
		
		int mid = l + (r - l) / 2;

		if(k <= a[mid]) r = mid-1;
		else l = mid + 1;
	}
	
	return l > n ? -1:l; 
}

int lower__search(int l,int r,int k){
	
	while(l < r){
		
		int mid = (l+r) / 2;
		
		if(k < a[mid]) r = mid;
		else l = mid + 1;
	}
	
	return l;
//	return a[l]!= a[k] ? -1 : l;
}

int main(){
	
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	int n,k;
	cin >> n >> k;
	
	for(int i = 1;i<=n;i++) cin >> a[i];
	
	Sort(1,n,a);
	
	for(int i = 1;i<=n;i++) cout << a[i] << " \n"[i == n];
	
	cout << "标准二分查找:" << endl;
	
	cout << search(1,n,k) << endl; 
	
	cout << "查找第一个大于k的位置: " << endl;
	
	cout << lower_search(1,n,k) << endl;
	
	cout << "查找第一个大于k的位置(清新脱俗版,不过找不到的时候也是需要判断一下的): " << endl;
	
	cout << lower__search(1,n,k) << endl; 
	
	return 0;
}

/*
5 9
3 5 7 2 4
2 3 4 5 7
*/ 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值