二分查找总结——左闭右开区间和左闭右闭区间(C++语言)
二分查找:
1.左闭右开区间,如有相同元素返回查找到的第一个元素。
PS:主循环判断条件都是一样的(left < right),注意这里不能取等号!有相同元素时,如果要返回第一个查找到的元素,则区间包含相同元素时应该从右向左收缩,这时判断条件应该加上等号,并且此时找到的就是第一个元素的秩;如果要返回最后一个查找到的元素,则区间包含相同元素时应该从左向右收缩,这时判断条件没有等号,并且此时找到的是大于目标元素的第一个元素的秩,因此应该返回的目标元素的秩等于找到的秩减一。
#include <iostream>
#include <stdio.h>using namespace std;//左闭右开,相同元素返回第一个
int binSearch(int* A, int e, int left, int right)
{while (left < right){int mid = left + ((right - left) >> 1); //移位操作比除操作快(e <= A[mid]) ? right = mid : left = mid + 1; //从右向左收缩} return left; //找到的就是需要返回的
}int main()
{int A[10] = { 0, 1, 2, 3, 3, 4, 5, 6, 6, 7 };int a = binSearch(A, 0, 0, 10);int b = binSearch(A, 1, 0, 10);int c = binSearch(A, 2, 0, 10);int d = binSearch(A, 3, 0, 10);int e = binSearch(A, 4, 0, 10);int f = binSearch(A, 5, 0, 10);int g = binSearch(A, 6, 0, 10);int h = binSearch(A, 7, 0, 10);printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d,h=%d\n", a, b, c, d, e, f, g, h);system("pause");return 0;
}
2.左闭右开区间,如有相同元素返回查找到的最后一个元素。
#include <iostream>
#include <stdio.h>using namespace std;//左闭右开,相同元素返回最后一个
int binSearch(int* A, int e, int left, int right)
{while (left < right){int mid = left + ((right - left) >> 1); //移位操作比除操作快(e < A[mid]) ? right = mid : left = mid + 1; //从左向右收缩}return --left; //真正返回的要减一
}int main()
{int A[10] = { 0, 1, 2, 3, 3, 4, 5, 6, 6, 7 };int a = binSearch(A, 0, 0, 10);int b = binSearch(A, 1, 0, 10);int c = binSearch(A, 2, 0, 10);int d = binSearch(A, 3, 0, 10);int e = binSearch(A, 4, 0, 10);int f = binSearch(A, 5, 0, 10);int g = binSearch(A, 6, 0, 10);int h = binSearch(A, 7, 0, 10);printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d,h=%d\n", a, b, c, d, e, f, g, h);system("pause");return 0;
}
3.左闭右闭区间,如有相同元素返回查找到的第一个元素。
PS:左闭右闭区间,主循环的判断条件要加上等于号,即(left <= right),而right = mid -1;这里很好理解,在右开区间的时候,不用减1,因为最右边的我们取不到是开区间,而当右边是闭区间的时候,我们要减一,从而可以变成和右边开区间一样的效果。其他的返回第一个元素和返回最后一个元素同左闭右开区间。
#include <iostream>
#include <stdio.h>using namespace std;//左闭右闭,相同元素返回第一个
int binSearch(int* A, int e, int left, int right)
{while (left <= right){int mid = left + ((right - left) >> 1); //移位操作比除操作快(e <= A[mid]) ? right = mid - 1 : left = mid + 1; //从右向左收缩} return left; //找到的就是需要返回的
}int main()
{int A[10] = { 0, 1, 2, 3, 3, 4, 5, 6, 6, 7 };int a = binSearch(A, 0, 0, 9);int b = binSearch(A, 1, 0, 9);int c = binSearch(A, 2, 0, 9);int d = binSearch(A, 3, 0, 9);int e = binSearch(A, 4, 0, 9);int f = binSearch(A, 5, 0, 9);int g = binSearch(A, 6, 0, 9);int h = binSearch(A, 7, 0, 9);printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d,h=%d\n", a, b, c, d, e, f, g, h);system("pause");return 0;
}
4.左闭右闭区间,如有相同元素返回查找到的最后一个元素。
#include <iostream>
#include <stdio.h>using namespace std;//左闭右闭,相同元素返回最后一个
int binSearch(int* A, int e, int left, int right)
{while (left <= right){int mid = left + ((right - left) >> 1); //移位操作比除操作快(e < A[mid]) ? right = mid - 1 : left = mid + 1; //从左向右收缩}return --left; //真正返回的要减一
}int main()
{int A[10] = { 0, 1, 2, 3, 3, 4, 5, 6, 6, 7 };int a = binSearch(A, 0, 0, 9);int b = binSearch(A, 1, 0, 9);int c = binSearch(A, 2, 0, 9);int d = binSearch(A, 3, 0, 9);int e = binSearch(A, 4, 0, 9);int f = binSearch(A, 5, 0, 9);int g = binSearch(A, 6, 0, 9);int h = binSearch(A, 7, 0, 9);printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d,h=%d\n", a, b, c, d, e, f, g, h);system("pause");return 0;
}
二分查找总结——左闭右开区间和左闭右闭区间(C++语言)相关推荐
- [201117] 为什么range范围是左闭右开区间?
[201117] 为什么range范围是左闭右开区间? range(i,j) 相当于 [i,j) 这实际上遵守的是不对称边界的设计思想,是一种编程技巧,其根本原因是为了解决程序设计中难于察觉的&quo ...
- python左闭右开区间_程序设计中左闭右开区间的广泛应用
(以下仅为个人主观看法,还请辩证看待!) 见过很多代码后不难发现,许多的程序中对于"区间"的设定,总是左闭右开[left,right).(当然,对于索引什么的是离散的数值). 甚至 ...
- 经典算法之右边界二分查找法(俗称基本右边界二分搜索法)
经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 前言 一.什 ...
- C++左闭右开区间的理解
C++的区间是左闭右开的,关于这样做的优势,做了一个笔记整理,也处理下之前一直比较模糊的区间二分的问题. 左闭右开的区间第一个优势是,当需要取中间元素的时候,mid=begin+end/2的定位问题. ...
- html左加右减按钮,左加右减自变量,上加下减常数项,大部分学生并没有真正理解!...
Hello,大家好,咱们又见面了,我就是传播知识传播爱的吴老师.有家长私聊我说孩子基础比较好,但是暑假预科的时候,在一次函数学习平移知识点的时候有点晕晕乎乎的.那这一期咱们就一起来深入的梳理一下一次函 ...
- 左值右值,左值引用和右值引用及其用途
目录 1.左值和右值 2.引用 (1)左值引用 (2)右值引用 3.左值引用的用途 (1)作为复杂名称变量的别名 (2)用于rangeFor循环 (3)避免复制大的对象 (4)参与函数中的参数传递 4 ...
- html 从左往右消失,从左到右语言写成从右到左html
好吧,我正在浏览一些与RTL相关的博客和示例,并提供了下面的工作示例. 在这段代码转换选项是存在的,你可以尝试两种LTR和RTL上点击这个按钮 - 下面是它的工作代码. // Jquery, BS3 ...
- 【程序设计】浅析编程语言的区间为何常是左闭右开
高中大家都学过区间--闭区间.开区间.左闭右开区间.左开右闭区间. 区间在Java里也有体现.比如用解析字符串子串的形式来提取身份证的信息,提取子串就相当于截取一个区间. 用一门语言,用的久应该会对它 ...
- 二分查找理论(三种问题类型、两种算法形式)
从这篇文章开始,我将开启算法专栏,记录在刀砍leetcode算法过程中的理论总结与实战代码,我认为二分算法是算法问题中细节最多的部分,所以我先拿它开刀!二分题目实战请看我的二分查找专栏:二分查找实战专 ...
最新文章
- 公众号管理01-基本架构
- Leetcode 120. 三角形最小路径和 (每日一题 20210927)
- ORACLE TEXT FILTER PREFERENCE(二)
- 使用YouTube API V3视频的完整描述- Google YouTube API V3 - Get Video Durations
- Mozilla 放出新的 Firefox 3.5 RC 版本(RC 3)
- 中芯国际第二代FinFET工艺有望与2020年底试产
- 2015年下半年《软件评测师》下午试卷及答案
- VSCode配置jupyter逐行语句运行python
- 删除表数据有两种方法及区别
- html+css+dom补充
- selenium+python模拟键盘鼠标操作,python3.6安装pyUserInput
- 天涯论坛--只看楼主
- 盘点国内最具实力的双足仿人机器人研发团队有哪些?
- ASP入门(一)环境的搭建
- react routers路由地址 F5刷新白屏
- Sparkling Logic SMARTS 实时决策分析模块介绍
- WPA渗透-pyrit:batch-table加速attack_db模块加速_“attack_db”模块加速
- 关于地下管线探测技术发展的思考
- 一个大概是被称作为“废物”的程序员的回顾,从18岁到30岁
- 中国电解铝行业投资机会与未来发展状况分析报告2022版
热门文章
- Kubernetes priviledge and capabilities
- vue大屏可视化自适应完美方案
- 华为交换机配置基础命令
- 微信 编辑器 后台 英文单词 换行 分开
- 伯努利分布、二项分布、几何分布、超几何分布、泊松分布
- 云服务器忘记密码怎么设置?云服务器BCC实例重置密码方法【附视频】
- 联想服务器linux系统raid驱动,ThinkSystem服务器RAID 530/930系列阵列卡驱动及安装RHEL7.3要点说明...
- oauth2单点登录总结
- java计算机毕业设计vue健康餐饮管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
- 静态路由,缺省路由和默认网关的区别