lower_bound和upper_bound

送分小仙女□ 提交于 2020-01-23 15:56:39
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找。
在从小到大的排序数组中,
  1. lower_bound(begin, end, num); 从数组的begin位置到end-1
    位置二分查找第一个大于等于num的数字,找到返回该数字的地址,不存在返回end。通过返回的地址减去起始地址begin,得到数字在数组中的下标。
  2. upper_bound(begin, end, num); 从数组的begin位置到end-1
    位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在返回end。通过返回的地址减去起始地址begin,得到数字在数组中的下标。
在从大到小的排序数组中,

重载lower_bound()和upper_bound()

  1. lower_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  2. upper_bound( begin,end,num,greater< type>() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;

const int maxn= 1e5+7;
#define long long ll
bool cmp(int a, int b){ return a > b;}

int main(){
	int num[6] = {1, 2, 4, 7, 15, 34};
	sort(num, num+6);
    for(int i = 0; i < 6; i++) cout << num[i] << " ";cout << endl;
	int pos1 = lower_bound(num, num+6, 7)-num;//返回数组中第一个大于或等于被查数
	int pos2 = upper_bound(num, num+6, 7)-num;//返回数组中第一个大于被查数
	cout<<pos1<<" "<<num[pos1]<<endl;
	cout<<pos2<<" " <<num[pos2]<<endl;
	sort(num, num+6, cmp);
	int pos3 = lower_bound(num, num+6, 7, greater<int>())-num;//返回数组中第一个小于或等于被查数
	int pos4 = upper_bound(num, num+6, 7, greater<int>())-num;//返回数组中第一个小于被查数
	for(int i = 0; i < 6; i++) cout << num[i] << " ";cout << endl;
	cout<<pos3<<" "<<num[pos3]<<endl;
	cout<<pos4<<" " <<num[pos4]<<endl;

	return 0;
}


注意:
  1. 返回的是地址;(要减去begin才得到下标)。
  2. 降序:一定要指定比较函数cmp–用于sort;lower_bound(): 小于等于; upper_bound()小于;//升降序都是在“后面”。
    运行结果
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!