C++二分函数(binary_search&lower_bound&upper_bound)

本文介绍了C++中用于二分查找的三个函数:binary_search、lower_bound和upper_bound。这三个函数都要求输入序列是有序的,位于`algorithm`头文件中。binary_search查找等于特定值的元素,返回布尔值;lower_bound找到第一个大于等于目标值的元素位置;upper_bound则找到第一个大于目标值的元素位置。文章还提供了每个函数的参数说明和使用示例。

:二分查找相信大家都知道了,如果你还不了解二分查找,可以先访问此网站来初步了解并学习二分查找这个算法。
https://blog.csdn.net/SkeletonKing233/article/details/99447270

一些类似模版一样的经典二分查找题目每次都得写一遍长长的代码,很浪费时间。而algorithm头文件为了避免大家浪费掉宝贵的时间,就出了三个二分查找的函数。

这些函数分别是binary_search、lower_bound和upper_bound函数,它们都是用二分查找来完成任务的log2(n)级别的函数,并且都定义在algorithm头文件中。

binary_search函数

所在头文件:algorithm

binary_search(a + begin, a + end, k, cmp);

必要条件:从a[begin]开始到a[end - 1]的序列是有序序列。

功能:在数组a中从a[begin]开始到a[end - 1]按照cmp函数来比较进行二分查找有没有一个数等于k。

返回值:如果有一个数等于k则返回值为true,否则为false

参数:

  1. 首地址(a + begin) 必要
  2. 末地址(a + end) 必要
  3. 需要搜索的值 必要
  4. 比较函数表示序列如何有序(多数情况下适用于对结构体的搜索) 选要

lower_bound函数

所在头文件:algorithm

lower_bound(a + begin, a + end, k, cmp);

必要条件:从a[begin]开始到a[end - 1]的序列是有序序列。

功能:在数组a中从a[begin]开始到a[end - 1]按照cmp函数来比较进行二分查找第一个大于等于k的数的位置,如果有第一个大于等于k的数则返回该数的地址,否则返回a[end]的地址。

返回值:地址。如果要转换为int,需减去数组a。

参数:

  1. 首地址(a + begin) 必要
  2. 末地址(a + end) 必要
  3. 需要比较的值 必要
  4. 比较函数表示序列如何有序(多数情况下适用于对结构体的搜索) 选要

upper_bound函数

所在头文件:algorithm

upper_bound(a + begin, a + end, k, cmp);

必要条件:从a[begin]开始到a[end - 1]的序列是有序序列。

功能:在数组a中从a[begin]开始到a[end - 1]按照cmp函数来比较进行二分查找第一个大于等于k的数的位置,如果有第一个大于k的数则返回该数的地址,否则返回a[end]的地址。

返回值:地址。如果要转换为int,需减去数组a。

参数:

  1. 首地址(a + begin) 必要
  2. 末地址(a + end) 必要
  3. 需要比较的值 必要
  4. 比较函数表示序列如何有序(多数情况下适用于对结构体的搜索) 选要

运行实例

备注:upper_bound与lower_bound的本质区别是upper_bound是查找第一个大于k的元素位置,而lower_bound是查找第一个大于等于k的元素位置。

以下为代码(PS:NR是指数组个数的上限)

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

# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)

const int NR = 100;

int n = 6;
int a[NR + 10] = {0, 1, 7, 7, 7, 13, 100};

int main()
{
	cout << "a数组从a[1]到a[n]这n个数中有7吗?" << binary_search(a + 1, a + n + 1, 7) << endl;
	cout << "a数组从a[1]到a[n]这n个数中有12吗?" << binary_search(a + 1, a + n + 1, 12) << endl;
	cout << "a数组从a[1]到a[n]这n个数中有0吗?" << binary_search(a + 1, a + n + 1, 0) << endl;
	
	cout << "a数组从a[1]到a[n]这n个数中第一个大于等于10的数的位数为" << lower_bound(a + 1, a + n + 1, 10) - a << endl;
	cout << "a数组从a[1]到a[n]这n个数中第一个大于等于13的数的位数为" << lower_bound(a + 1, a + n + 1, 13) - a << endl;
	cout << "a数组从a[1]到a[n]这n个数中第一个大于等于7的数的位数为" << lower_bound(a + 1, a + n + 1, 7) - a << endl;
	cout << "a数组从a[1]到a[n]这n个数中第一个大于等于10000的数的位数为" << lower_bound(a + 1, a + n + 1, 10000) - a << endl;
	
	cout << "a数组从a[1]到a[n]这n个数中第一个大于10的数的位数为" << upper_bound(a + 1, a + n + 1, 10) - a << endl;
	cout << "a数组从a[1]到a[n]这n个数中第一个大于13的数的位数为" << upper_bound(a + 1, a + n + 1, 13) - a << endl;
	cout << "a数组从a[1]到a[n]这n个数中第一个大于7的数的位数为" << upper_bound(a + 1, a + n + 1, 7) - a << endl;
	cout << "a数组从a[1]到a[n]这n个数中第一个大于10000的数的位数为" << upper_bound(a + 1, a + n + 1, 10000) - a << endl;
	return 0;
}

God Bless You For Ever!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值