前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >STL系列(二) 二分查找

STL系列(二) 二分查找

作者头像
木杉乀
发布于 2021-04-01 22:33:53
发布于 2021-04-01 22:33:53
38700
代码可运行
举报
文章被收录于专栏:木杉の小屋木杉の小屋
运行总次数:0
代码可运行

STL系列(二)二分查找

函数:binary_search

  • 内容里如有未知文章中未提到的函数引用请查看上一篇文章STL系列(一)sort用法
  • 本期内容会出现大量相似但不相同的话,认真阅读,注意对比,加深记忆,不要觉得内容重复而心烦
  • 注意加粗语句
  • 有疑问留言 or 评论

用法一(基本查找)

内容:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        binary_search( 数组名 + n1, 数组名 + n2,)
    
        n1和n2都是 int 类型的表达式 , 可以包含变量

        如果n1 = 0,+ n1 可以不写

        查找区间为下标范围为[n1,n2)的元素, 下标为n2的元素不在查找区间内 
                   
        在该区间内查找"等于"值的元素, 返回值为true(找到)false(没找到)
          
        "等于"的含义: a 等于 b <==> a < b和b < a都不成立
范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[] = { 12,45,3,98,21,7 };
	sort(a, a + 6);
	Print(a, 6);       //结果: 3,7,12,21,45,98
	cout << "Result : " << binary_search(a, a + 6, 12) << endl;  //Result : 1
	cout << "Result : " << binary_search(a, a + 6, 77) << endl;  //Result : 0
  • 在使用STL二分查找前要先用sort排序;

用法二 (自定义排序规则查找)

内容:

在用自定义排序规则排好序的 , 元素为任意的T类型得数组进行二分查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
binary_search(数组名 +n1 , 数组名 + n2 ,, 排序规则结果名() );
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
n1和n2都是int类型得表达式,可以包含变量

如果 n1 = 0 ,+ n1可以不写

查找区间为下标范围[n1,n2)的元素 , 下标为n2的元素不在查找区间内

在该区间内查找"等于"值的元素, 返回值为true(找到)false(没找到)

*查找时的排序规则,必须和排序时的规则一致!

"等于"的含义:  a 等于 b <==> "a必须在b前面""b必须在a前面"都不成立

重要的事多次强调加深印象! 不是水文章!

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int a[] = { 12,45,3,98,21,7 };
	sort(a, a + 6, Rule1());   //按从小到大排序(此处使用Rule1规则进行排序)
	Print(a, 6);               // 21,12,3,45,7,98
	cout << "Result : " << binary_search(a, a + 6, 7) << endl;          //Result : 0
	cout << "Result : " << binary_search(a, a + 6, 8, Rule1()) << endl; //Result : 1
	return 0;

上面代码第4行为错误代码

此处编译器返回值为0并不是意味着没查到!

binary_search()二分查找规则必须与排序规则一致, 否则返回值 没有意义

完整代码:(包含自定义函数)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include
#include
#include

using namespace std;
struct Rule1 {
	bool operator()(const int& a1, const int& a2)const {
		return a1 % 10 < a2 % 10;
	}
};

void Print(int a[], int size);

int main() {
	int a[] = { 12,45,3,98,21,7 };
	sort(a, a + 6);
	Print(a, 6);
	cout << "Result : " << binary_search(a, a + 6, 12) << endl;
	cout << "Result : " << binary_search(a, a + 6, 77) << endl;
	sort(a, a + 6, Rule1());//按从小到大排序
	Print(a, 6);
	cout << "Result : " << binary_search(a, a + 6, 7) << endl;
	cout << "Result : " << binary_search(a, a + 6, 8, Rule1()) << endl;
	return 0;
}

void Print(int a[], int size) {
	int i;
	for (i = 0; i < size - 1; i++) {
		cout << a[i] << ",";
	}
	cout << a[i];
	cout << endl;
}

函数lower_bound

用法一(查找下界)

在对元素类型为 T 的从小到大排好序的基本数据类型中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * lower_bound(数组名 + n1 , 数组名 + n2 ,);

返回一个指针 T * p;

*p 是查找区间里下标最小的,大于等于"值"的元素. 如果找不到, p 指向下标为n2 的元素

注意:n2不在查询范围内哦!

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
	sort(a, a + NUM);
	Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
	int* p1 = lower_bound(a, a + NUM, 5); //范围整个数组,p1指向下标最小的 大于等于5的元素
	cout << " p1指向的内容:"<< *p1 << "  下标:" << p1 - a << endl;   // 结果:5,1

用法二(自定义规则查找下界)

在对元素类型为 T ,按照自定义排序规则排好序的数组中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * lower_bound(数组名 + n1 , 数组名 + n2 ,, 排序规则结构名());

返回一个指针 T * p;

*p 是查找区间里下标最小的,按自定义排序规则 , 可以 排在"值"后面的元素. 如果找不到,p指向下标为n2的元素

注意:n2不在查询范围内哦!

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
    sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)

后面内容可以自己试着分析原因


函数upper_bound

用法一(查找上界)

内容:

在元素类型为 T 的从小到大排好序的基本类型得数组中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * upper_bound(数组名 + n1 , 数组名 + n2 ,);

返回一个指针 T * p;

*p 是查找区间里下标最小的, 大于"值"的元素. 如果找不到, p指向下标为n2 的元素

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
	sort(a, a + NUM);
    Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
    int* p2 = upper_bound(a, a + NUM, 5); //范围整个数组,p2指向下标最小的 大于5的元素
	cout << *p2 << endl;  // 结果:7
	cout << *upper_bound(a, a + NUM, 13) << endl;//查找大于13的下标最小的元素值 结果 :21

用法二(自定义规则查找上界)

内容:

在元素为任意的T类型 , 按照自定义排序规则排好序的数组中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * upper_bound(数组名 + n1 , 数组名 + n2 ,, 排序规则结构体());

返回一个指针 T * p;

*p 是查找区间内下标最小的, 按自定义排序规则, **必须 **排在 “值” 后面的元素 . 如果找不到 ,p指向下标为n2的元素

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
    sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)
	cout << upper_bound(a, a + NUM, 18, Rule1()) - a << endl; // 结果 : 7 (无意义)(个位数大于8无法找到)(找不到时返回终点元素)
	if (upper_bound(a, a + NUM, 18, Rule1()) == a + NUM)
	cout << "not found" << endl;     // ==>not found;
	cout << *upper_bound(a, a + NUM, 5, Rule1()) << endl;      // 结果 : 7 (自己想想原因)
	cout << *upper_bound(a, a + NUM, 4, Rule1()) << endl;      // 结果 : 5

完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include
#include
#include

#define NUM 7
using namespace std;
struct Rule1 {
	bool operator()(const int& a1, const int& a2)const {
		return a1 % 10 < a2 % 10;
	}
};
void Print(int a[], int size);

int main() {
	int a[NUM] = { 12,5,3,5,98,21,7 };
	sort(a, a + NUM);
	Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
	int* p1 = lower_bound(a, a + NUM, 5); //范围整个数组,p1指向下标最小的 大于等于5的元素
	cout << " p1指向的内容:"<< *p1 << "  下标:" << p1 - a << endl;   // 结果:5,1
	int* p2 = upper_bound(a, a + NUM, 5); //范围整个数组,p2指向下标最小的 大于5的元素
	cout << *p2 << endl;  // 结果:7
	cout << *upper_bound(a, a + NUM, 13) << endl;//查找大于13的下标最小的元素值 结果 :21
	sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)
	cout << upper_bound(a, a + NUM, 18, Rule1()) - a << endl; // 结果 : 7 (无意义)(个位数大于8无法找到)(找不到时返回终点元素)
	if (upper_bound(a, a + NUM, 18, Rule1()) == a + NUM)
		cout << "not found" << endl;     // ==>not found;
	cout << *upper_bound(a, a + NUM, 5, Rule1()) << endl;      // 结果 : 7 (自己想想原因)
	cout << *upper_bound(a, a + NUM, 4, Rule1()) << endl;      // 结果 : 5
	return 0;
}

void Print(int a[], int size) {
	int i;
	for (i = 0; i < size - 1; i++) {
		cout << a[i] << ",";
	}
	cout << a[i];
	cout << endl;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Angularjs基础(十二)
ng-model-options       描述:规定如何更新模型             实例: 在失去焦点时绑定输入框的值scope 变量中。                 <div ng-app="myApp" ng-controller="myCtrl">                   <input ng-model ="name">                 </div>                 <script>          
用户1197315
2018/01/22
3.2K0
【一起来烧脑】一步学会AngularJS系统
AngularJS是一个JavaScript框架 一个用JavaScript编写的库
达达前端
2019/07/18
5.8K0
【一起来烧脑】一步学会AngularJS系统
Angularjs基础(三)
    AngularJS ng-model 指令     ng-model 指令用于绑定应用程序数据到HTML 控制器(input,select,textarea)的值 ng-model指令     ng-model指令可以将输入域的值与AngularJS 创建的变量绑定。       实例:         <div ng-app="myApp" ng-controller="myCtrl">             名字:<input ng-model="name">  
用户1197315
2018/01/19
3.3K0
Angularjs基础(六)
AngularJS HTML DOM     AngularJS为HTML DOM 元素的属性提供了绑定应用数据的指令。 ng-disabled指令     ng-disabled指令直接绑定应用数据到HTML的disabled属性。       实例:       <div ng-app="" ng-init="mySwitch=true">         <p>           <button ng-disableled="mySwitch">点我!</button
用户1197315
2018/01/19
3.2K0
7-进军 angular1.x 表单和事件、模块
通常 AngularJS 应用程序将模块和控制器包含在 JavaScript 文件中。
西南_张家辉
2021/02/02
2.5K0
Angularjs基础(七)
AngularJS表单     AngularJS表单时输入控件的集合 HTML控件     一下HTML input 元素被称为HTML 控件:         input 元素         select元素         button元素         textarea元素 HTML 表单     AngularjS表单上实例       <div ng-app="myApp" ng-controller="formCtrl">          <from nova
用户1197315
2018/01/19
2.2K0
AngularJS ng-model 指令
ng-model 指令用于绑定应用程序数据到 HTML 控制器(input, select, textarea)的值。
陈不成i
2021/07/23
1.1K0
AngularJS系列(五)——下拉框
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
1.6K0
Angularjs基础(十)
ng-blur  描述:规定blur 事件的行为       实例:当输入框失去焦点的(onblur)时执行表达式:         <input ng-blur="count = count + 1" ng-init="count=0"/>         <h1>{{count}}</h1>       定义和用法           ng-blur 指令用于告诉AngularJS HTML 元素在失去焦点时须执行的表达式。           语法:<element ng-blur
用户1197315
2018/01/22
3.5K0
AngularJS 事件
ng-hide 指令设置 <p>元素及两个输入域是否可见, 根据 myVar 的值 (true 或 false) 来设置是否可见。
陈不成i
2021/07/23
1.7K0
AngularJS系列(八)——事件
ng-click :点击 ng-click 指令定义了 AngularJS 点击事件。 <div ng-app="myApp"ng-controller="myCtrl"> <buttonng-click="count=count+1">点我!</button> <p>{{count}}</p> </div> <script> var app = angular.module('myApp', []); app.controller('myCtrl', function
逝兮诚
2019/10/30
5300
Angularjs基础(九)
AngularJS 应用 应用程序讲解     实例:         <html ng-app="myNoteApp">           <head>             <meat charset="utf-8">             <script src="http://apps.bdimg.com/libs/angular.js/1.4.6angular.min.js"></script>           </head>           <body>
用户1197315
2018/01/22
1.3K0
Angularjs基础(四)
AngularJS过滤器     过滤器可以使用一个管道符(|)添加到表达式和指令中。       AngularJS过滤器可用于转换数据:           currency     格式化数字为货币格式           filter       从数组中选着应子集。           lowercase      格式化字符串为小写。           orderBy      根据某个表达式排列数组           uppercase     格式化
用户1197315
2018/01/19
3.1K0
3-进军 angular1.x 模型和作用域 scope
View(视图), 即 HTML。 Model(模型), 当前视图中可用的数据。 Controller(控制器), 即 JavaScript 函数,可以添加或修改属性。 scope 是模型。
西南_张家辉
2021/02/02
1.4K0
AngularJS Scope(作用域)
Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带。
陈不成i
2021/07/23
1.6K0
第215天:Angular---指令
在 AngularJS 中将前缀为 ng- 这种属性称之为指令,其作用就是为 DOM 元素调用方法、定义行为绑定数据等
半指温柔乐
2018/09/11
3.4K0
AngularJS系列之select下拉选择第一个选项为空白的解决办法
今天给大家介绍一下AngularJS系列之select下拉选择第一个选项为空白的解决办法。 相信大家也经常遇到这种情况吧:在使用AngularJS中的select组件开发的时候,莫名其妙的第一个选项就
林老师带你学编程
2018/01/03
3.3K0
AngularJS Select(选择框)
在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如下实例:
陈不成i
2021/07/23
2.6K0
【AngularJS】—— 2 初识AngularJs(续)
前一篇了解了AngularJS的一些简单的使用,这里继续跟着w3c学习一下剩下的内容。   本篇根据w3cschool.cc继续学习AngularJS剩余的内容,包括:   1 事件   2 模块   3 表单   4 数据验证   5 bootstrap CSS风格   6 include包含其他页面   7 应用程序   8 参考手册   首先看一下html的事件   关于html的事件,文中给出了三个例子,点击、隐藏、显示。使用方法基本相同:   先看一下点击的例子,点击按钮后,会触发ng-clic
用户1154259
2018/01/17
2.4K0
AngularJS 控制器
控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。
陈不成i
2021/07/23
1.2K0
相关推荐
Angularjs基础(十二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验