哈喽!这里是一只派大鑫,不是派大星。本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习。更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段找到好的方法、路线,让天下没有难学的程序(只有秃头的程序员 2333),学会程序和算法,走遍天下都不怕!

今天来讲述二分的思想,一篇文章带你读懂二分查找!

大家还知道怎么在一本很厚的词典查找一个单词吗?字典中的单词是按照“字典序”进行排序的,比如 code<pan<pancake 。如果我们要找一个单词,就要将字典从中间翻开,然后将这面单词跟想要找的单词比较。如果这面单词在需要寻找的单词之前,就将字典往后翻,否则就往前翻,直到找到准确的单词为止。

大家可以发现,越接近需要查询的单词,翻动书面的页数就越少。你肯定不会从第一页开始一面一面翻,逐个查看每个单词是否就是自己想要查的单词,这样做就太慢了。虽然实际情况不是那么精确,但是基本上使用了“二分思想”。

如果序列是有序的,就可以通过二分查找快速定位所需要的数据。除此之外,二分思想还能求出可行解的最值问题,比如想知道某款手机最高能多少楼高度摔下来而不会摔坏,使用二分的方式可以用最小实验次数就能得到结果(当然你需要准备好几个样品)。

根据上述翻字典的思想,我们可以得到一个最基础版本的二分查找

int find(int x){int l = 1,r = n;while(l <= r){int mid = l + (r - l) / 2;if(a[mid]==x) return mid;else if(a[mid] > x) r = mid - 1; //往左查找else l = mid + 1; //往右查找}return -1; //退出循环还没有返回,则说明找不到这个值
}

很简单、清晰、明了吧,就像模拟一样,跟着思想来编写就好。

但是这个算法并不完美!

更完美的要求应该是:如果带查询数字有多个,则输出最小编号;

如果不存在这个数字,则输出比他大的数字中最小的数字编号;

如果没有比他大的数字,则输出n+1;

如果遇到重复的数字,你们这个算法就会直接输出最先找到的编号。

而上述程序仅在序列中的数字都不相同的时候才是对的,如果出现重复的数字,

则上述代码会直接输出最先找到的编号。

下面给出修改后的代码,请读者特别注意是 小于 还是 小于等于, 有没有加1、减1等细节

int find(int x){int l = 1,r = n+1;while(l<r){int mid = l + (r - l) / 2;if(a[mid]>=x) r=mid;else l = mid + 1;}if(a[l]==x) return l;else return -1;
}

进行这样的修改之后,我们就可以查找到最小编号(如果有重复的话)

那么如果想要在重复中找到最大编号呢?

很简单,只需要这样修改即可

int find(int x){int l = 1,r = n+1;while(l<=r){int mid = l + (r - l) / 2;if(a[mid] <= x) l = mid + 1;else r = mid - 1;}if(a[r]==x) return r;else return -1;
}

以上就是二分查找的基本情况了,当然 在实际运用中 可以直接使用STL里的二分查找函数即可。

二分查找详解——弄懂二分思想的重要性!相关推荐

  1. 二分查找详解(Java)

    1.线性查找 在我们了解二分查找之前,我们先来了解线性查找 线性查找的思想: 我们在对数组遍历的时候,通过每个值每个值的判断去实现我们的待查找的值是否存在当前数组中,如果存在就返回当前的索引. 代码实 ...

  2. C语言经典算法之二分查找详解

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:C语言从入门到进阶 语录:Stay hungry stay foolish 集接口文档工具.接口Mock工具.接口自动化测试工具.接口调试工具于一体 ...

  3. 【二分查找详解外加递归写法】附有全部代码

    二分查找 二分查找:在有序(升序或降序)的集合上,才能使用二分查找. 二分查找的思路: 在一个有序数组中查找一个数 n,我们可以把 n 与 数组的中间元素(mid)不断的去比较, ​ 若 n < ...

  4. 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)

    一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...

  5. 算法与数据结构 - 二分查找详解,会了吗?

    一.引言 相信很多小伙伴都和朋友做过一个小互动: 今天李雷和韩梅梅一起相约去逛街,期间李雷发现韩梅梅穿了一双限量款的球鞋. 李雷: 韩同学,你这双鞋好漂亮哦,在哪里买的呢? 韩梅梅: 这是我在莆田的网 ...

  6. 【数据结构和算法】动图演示,超详细,就怕你不会,二分查找详解

  7. 二分查找算法详解(经典二分和左右边界查找)

    目录 二分查找算法 1. 二分查找算法框架 2. 经典二分查找算法 问题1. 为什么while循环中使用<=号而不是用<号,右边区间right为什么要对数组大小减一? 问题2. 为什么 l ...

  8. 经典算法之左边界二分查找法(俗称左边界二分搜索法)

    经典算法之左边界二分查找法(俗称左边界二分搜索法) 文章目录 经典算法之左边界二分查找法(俗称左边界二分搜索法) 前言 一.什么左边界二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的 ...

  9. 二分查找python实现代码_二分查找——Python实现

    一.排序思想 二.python实现 def binarySearchDemo(arr, key): """ python二分查找非递归方式 :param arr:待排序列 ...

最新文章

  1. oracle数据如何获取游标中动态字段_如何实现报表数据的动态层次钻取(二)
  2. python server酱_面向回家编程!GitHub标星两万的quot;Python抢票神器”快用起来!...
  3. 雄安大学真的来了!占地总面积2550亩!
  4. Linux Shell脚本_较少Swap使用
  5. ligerui_ligerTree_005_动态增加“树”节点
  6. Julia 向 Python 宣战!
  7. shell实例100例《六》
  8. C# http监听之Nancy.net
  9. 多频电磁感应仪GEM-2介绍
  10. matlab哈明窗带阻,MATLAB数字滤波器程序 Hamming窗带通滤波器
  11. css如何放大网页字体大小怎么调整,CSS网页设计时关于字体大小的设计
  12. 服务器怎么用iso文件装系统,ISO镜像文件能直接安装吗 怎么使用iso镜像文件安装系统...
  13. php5市场占有率,javascript,php_目前国内浏览器的市场占有率?,javascript,php,html,html5,css - phpStudy...
  14. 高德地图可视化3D地图区域上添加棱柱
  15. cadence导入dxf文件_PCB原创|cadence allegro导入DXF文件操作步骤
  16. Python pip distribute
  17. 2019新征程 | SMIA新一批会员公示
  18. 读《哪有没时间这回事》有感
  19. python基础教程第三版豆瓣-数据结构与算法必读书单吐血整理推荐【附网盘链接】...
  20. python自动化输入文本_python输入文本

热门文章

  1. ~~~~~~~~~~~~~~坏公司鉴别方法 ~~~~~~~~~~~
  2. python爬虫之---------------cookie和session
  3. sessionkey 微信小程序获取_微信小程序获取sessionkey,Connection reset
  4. (42)Gulp在Yeoman脚手架工具中的应用
  5. thinkphp 响应
  6. es6 Symbol.for(),Symbol.keyFor()
  7. CSS属性值之百分数
  8. Less的@import指令
  9. android序列化好处,浅谈Android序列化
  10. python3.6.1安装,linux下安装Python3.6.1