二分算法的本质是:假如我们可以找到事物的某种性质,这种性质可以将区间一分为二,一半满足,一半不满足。我们就可以二分。

另外,有连续性必可以 二分。

二分模板一共有两个,分别适用于不同情况。我们研究的是int查找(最复杂)
算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。

原理

已知在递增q[]查找x,数组左右边界分别为l,r,mid为数组中间的下标。

我们比较 x和q[mid]

1.若x    <= q[mid],那么x在数组q的左半边,那么此时我们将右边界等于此时数组中间下标

也就是r = mid;

2.若x!<= q[mid],那么x在数组q的又半边,那么此时我们将左边界等于此时数组中间下标

也就是l = mid;

如此循环,循环的条件是l<r,l、r之间的距离会越来越小,最终相遇,所以找遍数组,此时l=r。输出下标。

最后判断x是否等于q[l].

版本1(x <= q[mid])

当我们将区间[l, r]划分成[l, mid][mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。

int sort_quick1(int q[],int l, int r)
{while (l < r){int mid = l + r >> 1;if (x <= q[mid]) r = mid;//注意我们判断的条件x <= q[mid]else l = mid + 1;}return l;
}

假设数组中不止一个x,那么最终找出来的下标,是靠左?还是靠右呢?

注意判断条件q[mid]>=x,所以我们找的是第一个大于x的数的下标。

因为数组q是递增的,所以最终下标靠又边。

上面这个细节,是不容忽视的。

版本2(x >= q[mid])

当我们将区间[l, r]划分成[l, mid-1][mid , r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时需要加1。

int sort_quick1(int q[],int l, int r)
{while (l < r){int mid = l + r + 1>> 1;if (x >= q[mid]) l = mid;//注意我们判断的条件x >= q[mid]else r = mid - 1;}return l;
}

注意此时计算mid方法变了,是mid =  l  + r + 1>>1

为什么要加一呢?

原来是c++计算除法时会向下取整,假如不加一,那么当r-l<1时

l + r +1>>1 结果为l,导致了l = mid ,l 不能变化,导致死循环。

假设数组中不止一个x,那么最终找出来的下标,是靠左?还是靠右呢?

注意判断条件q[mid]<=x,所以我们找的是第一个小于x的数的下标。

因为数组q是递增的,所以最终下标靠左边。

相信看完了这篇文章,相信大家对二分已经掌握,大家自己去试试吧,这很重要哦,这很重要哦,这很重要哦。欢迎大家在评论区讨论,觉得还不错的话,点个关注,后续会持续更新。

超易懂!二分查找 详析相关推荐

  1. 二分查找详解——弄懂二分思想的重要性!

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

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

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

  3. 二分查找详解(Java)

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

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

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

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

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

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

  7. 二分查找(折半查找)详解

    二分查找详解 1. 二分查找的引入 2. 二分的一些基本知识 1) 定义 2) 特点 3. 二分查找的边界问题 1) 常用模板 2)综合练习 4.二分的应用 1) Flyer 2) Distribut ...

  8. Python实现二分查找算法,图片结合代码讲解,简单易懂

    Python实现二分查找算法,图片结合代码讲解,简单易懂 二分查找是指在一个数组中循环找到特定的目标元素的一种算法,二分查找算法要求这个数组必须是有序的,如果不是有序则最后得出的结果是不准确的,因为其 ...

  9. 文巾解题 704. 二分查找

    1 题目描述 2 解题思路 二分查找见: 二分查找详解_刘文巾的博客-CSDN博客 class Solution(object):def search(self, nums, target):left ...

最新文章

  1. rh9.0虚拟机dmesg启动过程分析(2)
  2. GIT:本地有更改,但强制作远程仓库里作更新
  3. spring-data-redis工程
  4. Python6:oriented objective programming
  5. highcharts 绘制图标的JAVASCRIPT 类库 收藏
  6. Two.js – 为现代浏览器而生的 2D 绘图 API
  7. 征稿 | “健康知识图谱”投稿通道开启
  8. Vue路由 --登录状态的判断
  9. QT4.7和VS2008 顺利安装必读 (最新版)
  10. cmd 命令行中乱码问题解决
  11. matlab interp2插值函数的使用
  12. 傻瓜式激活win10,真的太简单了,一个3.3M小软件只有一个激活按钮,点一下就激活了。
  13. ubuntu切换输入法快捷键
  14. 【笔记整理】node.js笔记
  15. 内网穿透远程访问家里的群晖NAS 1-2
  16. 如何定位web前后台的BUG
  17. R语言入门(二)正态性检验与假设检验
  18. java 使用7z进行解压_java调用7zip解压压缩包的实例
  19. Google Ad加大型文字广告将停用
  20. liferay开发环境搭建

热门文章

  1. 量子计算机传到信号,量子十问之四:量子技术能将人“瞬间”转移到别的星球上吗?...
  2. 本科课程模糊综合评价系统设计与实现
  3. centos8使用syncthing自启动的两种方式
  4. 《RefineMask:Towards High-Quality Instance Segmentation with Fine-Grained Features》论文笔记
  5. Oracle 查询当前用户所有表以及统计表内数据行数
  6. blogbus.com(博客大巴)XSS跨站漏洞
  7. 《Python编程从入门到实践》_第二章_变量和简单数据类型
  8. 基于BQ76PL455的BMS电路板设计
  9. 实现类似淘票票电影滑动选择的效果
  10. 谁说chatGPT要取代数据分析师?