二分查找:

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++语言)相关推荐

  1. [201117] 为什么range范围是左闭右开区间?

    [201117] 为什么range范围是左闭右开区间? range(i,j) 相当于 [i,j) 这实际上遵守的是不对称边界的设计思想,是一种编程技巧,其根本原因是为了解决程序设计中难于察觉的&quo ...

  2. python左闭右开区间_程序设计中左闭右开区间的广泛应用

    (以下仅为个人主观看法,还请辩证看待!) 见过很多代码后不难发现,许多的程序中对于"区间"的设定,总是左闭右开[left,right).(当然,对于索引什么的是离散的数值). 甚至 ...

  3. 经典算法之右边界二分查找法(俗称基本右边界二分搜索法)

    经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 前言 一.什 ...

  4. C++左闭右开区间的理解

    C++的区间是左闭右开的,关于这样做的优势,做了一个笔记整理,也处理下之前一直比较模糊的区间二分的问题. 左闭右开的区间第一个优势是,当需要取中间元素的时候,mid=begin+end/2的定位问题. ...

  5. html左加右减按钮,左加右减自变量,上加下减常数项,大部分学生并没有真正理解!...

    Hello,大家好,咱们又见面了,我就是传播知识传播爱的吴老师.有家长私聊我说孩子基础比较好,但是暑假预科的时候,在一次函数学习平移知识点的时候有点晕晕乎乎的.那这一期咱们就一起来深入的梳理一下一次函 ...

  6. 左值右值,左值引用和右值引用及其用途

    目录 1.左值和右值 2.引用 (1)左值引用 (2)右值引用 3.左值引用的用途 (1)作为复杂名称变量的别名 (2)用于rangeFor循环 (3)避免复制大的对象 (4)参与函数中的参数传递 4 ...

  7. html 从左往右消失,从左到右语言写成从右到左html

    好吧,我正在浏览一些与RTL相关的博客和示例,并提供了下面的工作示例. 在这段代码转换选项是存在的,你可以尝试两种LTR和RTL上点击这个按钮 - 下面是它的工作代码. // Jquery, BS3 ...

  8. 【程序设计】浅析编程语言的区间为何常是左闭右开

    高中大家都学过区间--闭区间.开区间.左闭右开区间.左开右闭区间. 区间在Java里也有体现.比如用解析字符串子串的形式来提取身份证的信息,提取子串就相当于截取一个区间. 用一门语言,用的久应该会对它 ...

  9. 二分查找理论(三种问题类型、两种算法形式)

    从这篇文章开始,我将开启算法专栏,记录在刀砍leetcode算法过程中的理论总结与实战代码,我认为二分算法是算法问题中细节最多的部分,所以我先拿它开刀!二分题目实战请看我的二分查找专栏:二分查找实战专 ...

最新文章

  1. 公众号管理01-基本架构
  2. Leetcode 120. 三角形最小路径和 (每日一题 20210927)
  3. ORACLE TEXT FILTER PREFERENCE(二)
  4. 使用YouTube API V3视频的完整描述- Google YouTube API V3 - Get Video Durations
  5. Mozilla 放出新的 Firefox 3.5 RC 版本(RC 3)
  6. 中芯国际第二代FinFET工艺有望与2020年底试产
  7. 2015年下半年《软件评测师》下午试卷及答案
  8. VSCode配置jupyter逐行语句运行python
  9. 删除表数据有两种方法及区别
  10. html+css+dom补充
  11. selenium+python模拟键盘鼠标操作,python3.6安装pyUserInput
  12. 天涯论坛--只看楼主
  13. 盘点国内最具实力的双足仿人机器人研发团队有哪些?
  14. ASP入门(一)环境的搭建
  15. react routers路由地址 F5刷新白屏
  16. Sparkling Logic SMARTS 实时决策分析模块介绍
  17. WPA渗透-pyrit:batch-table加速attack_db模块加速_“attack_db”模块加速
  18. 关于地下管线探测技术发展的思考
  19. 一个大概是被称作为“废物”的程序员的回顾,从18岁到30岁
  20. 中国电解铝行业投资机会与未来发展状况分析报告2022版

热门文章

  1. Kubernetes priviledge and capabilities
  2. vue大屏可视化自适应完美方案
  3. 华为交换机配置基础命令
  4. 微信 编辑器 后台 英文单词 换行 分开
  5. 伯努利分布、二项分布、几何分布、超几何分布、泊松分布
  6. 云服务器忘记密码怎么设置?云服务器BCC实例重置密码方法【附视频】
  7. 联想服务器linux系统raid驱动,ThinkSystem服务器RAID 530/930系列阵列卡驱动及安装RHEL7.3要点说明...
  8. oauth2单点登录总结
  9. java计算机毕业设计vue健康餐饮管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  10. 静态路由,缺省路由和默认网关的区别