必要条件:给定的数组必须有序,否则不适用二分查找。如果传入的数组无序,则要先对其排序,再进行二分,查找。那排序问题可参考其它排序算法。这篇博文的重点是讲二分。

核心思路:二分区间,找到划分的区间中点位置的元素,与输入比较

具体实现步骤:
1)设置查找区间的左端点 l,初始化为原数组的最小的索引。
2)设置查找区间的右端点 r,初始化为原数组的最大索引。
3)只要左端点值小于等于右端点值,从第4步开始进行操作;否则结束循环,查找完毕,返回一个标志如-1,表示在数组中都没找到与value相等的值,不再进行下面的操作。
4)对给定的区间开始二分,得到数组的中点位置元素的索引mid=l+(r-l)/2
5) 将区间中点的元素与查找目标比较。
6)若目标元素与区间中间位置的元素相等,则返回目标元素在原数组中索引,并结束查找,不再进行下面的操作;否则进行下面的步骤。
7)若目标元素小于区间中间位置的元素,说明查找目标可能存在于较小的区间内,所以调整右端点的索引,r=mid-1,使查找范围变为两个查找区间中较小的一个,跳转到第4步执行。
8)若目标元素大于区间中间位置的元素,说明查找目标可能存在于较大的区间内,所以调整左端点的索引l=mid+1,使查找范围变为两个查找区间中较大的一个,跳转到第4步执行。

温馨提示:计算中点mid=l+(r-l)/2与mid=(l+r)/2,人算的话都可以,因为人的大脑存储信息不像电脑那般固定大小,对于固定数据类型存储空间的机器来说,计算l+r是存在bug的。

我们知道,数据类型在计算机里存储都是有长度限定的。
如果l和r都很大,快接近某种类型的最大值了。
那计算机计算l+r,就会得到错误结果,因为计算结果很容易就超过这种类型所能存储的最大容量,因而会把计算结果高位溢出,这样显然的不到正确结果。
而l+(r-l)/2这种方式就不会存在上述问题,因为r和l如果在编译时都不报错,那r-l显然也不会存在问题,把r-l的结果除以2再与l相加,也不会存在问题,所以整个计算过程都不会有问题,这也是二分查找中很关键的一步。

代码实现与详细解读:

package compute;/*** 二分查找*@create by gzx on 2022-2-11*/
public class BinarySearch {public static void main(String[] args) {int[] src= {1,2,3,5,6,7,7,8,9};int i = search(src, 10);System.out.println(i);int j = search(src, 0);System.out.println(j);int k = search(src, 7);System.out.println(k);int m = search(src, 4);System.out.println(m);int n = search(src, 6);System.out.println(n);}/*** @param src 原数组,必须为有序数组* @param target 要在数组src中查找的目标值* @return 首次在src中找到的、与target相等的元素的下标*/public static int search(int[] src,int taget) {int l=0;//左端点,初始化为原数组的最小的索引int r=src.length-1;//右端点,初始化为原数组的最大索引while(l<=r) {//说明还没有二分完毕int mid=l+(r-l)/2;//对给定的区间开始二分,得到数组的中点位置元素的索引if (taget==src[mid]) {//表示查找到目标return mid;//返回目标元素在原数组中索引,并结束查找,不再进行下面的操作}if (taget<src[mid]) {//说明查找目标可能在较小的区间内r=mid-1;//所以调整右端点的索引,使查找范围变为两个查找区间中较小的一个}else{//说明查找的目标可能在较大的区间内l=mid+1;//所以调整左端点的索引,使查找范围变为两个区间较大的一个}}return -1;//二分遍历完毕,在数组中都没找到与value相等的值,则返回下标-1表示未找到}
}
对数组{1,2,3,5,6,7,7,8,9}进行五次查找操作
     int i = search(src, 10);System.out.println(i);int j = search(src, 0);System.out.println(j);int k = search(src, 7);System.out.println(k);int m = search(src, 4);System.out.println(m);int n = search(src, 6);System.out.println(n);
查找结果
-1
-1
6
-1
4

二分查找,超详细解读与代码实现,看完不会取关相关推荐

  1. 超详细vr全景拍摄教程,看完别说你还不会全景拍摄

    一.VR VR 全景拍摄设备推荐型号 1.佳能入门级全画幅 6D 单反机身 2.鱼眼镜头(8-15mm) 3.思锐三脚架 R-2204 4.思锐云台 PB-10 二. VR 全景拍摄器材及组装 ◆ 首 ...

  2. 单链表的操作(超详细),保证你看完不后悔

  3. 经典神经网络论文超详细解读(三)——GoogLeNet InceptionV1学习笔记(翻译+精读+代码复现)

    前言 在上一期中介绍了VGG,VGG在2014年ImageNet 中获得了定位任务第1名和分类任务第2名的好成绩,而今天要介绍的就是同年分类任务的第一名--GoogLeNet . 作为2014年Ima ...

  4. 经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)

    前言 今天我们一起来学习何恺明大神的又一经典之作: ResNeXt(<Aggregated Residual Transformations for Deep Neural Networks&g ...

  5. EfficientDet(EfficientNet+BiFPN)论文超详细解读(翻译+学习笔记+代码实现)

    前言 在之前我们介绍过EfficientNet(直通车:[轻量化网络系列(6)]EfficientNetV1论文超详细解读(翻译 +学习笔记+代码实现) [轻量化网络系列(7)]EfficientNe ...

  6. 【轻量化网络系列(2)】MobileNetV2论文超详细解读(翻译 +学习笔记+代码实现)

    前言 上一篇我们介绍了MobileNetV1,主要是将普通Conv转换为dw和pw,但是在dw中训练出来可能会很多0,也就是depthwise部分得到卷积核会废掉,即卷积核参数大部分为0,因为权重数量 ...

  7. 【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)

    前言 从这篇开始,我们将进入YOLO的学习.YOLO是目前比较流行的目标检测算法,速度快且结构简单,其他的目标检测算法如RCNN系列,以后有时间的话再介绍. 本文主要介绍的是YOLOV1,这是由以Jo ...

  8. 二分查找算法详细汇总

    二分查找算法详细汇总 文章目录 二分查找算法详细汇总 二分查找算法介绍模板 算法思想 举例说明 模板实现 (1)递归方式实现 (2)非递归方式实现 二分查找问题相关难点问题1[前缀和 + 二分查找 + ...

  9. 经典神经网络论文超详细解读(二)——VGGNet学习笔记(翻译+精读)

    前言 上一篇我们介绍了经典神经网络的开山力作--AlexNet:经典神经网络论文超详细解读(一)--AlexNet学习笔记(翻译+精读) 在文章最后提及了深度对网络结果很重要.今天我们要读的这篇VGG ...

最新文章

  1. boost::fusion::pop_back用法的测试程序
  2. 职业:图像处理入门教程
  3. 图谱实战 | 面向C端场景的概念图谱构成、建设与应用索引
  4. Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方
  5. Java程序员,上班那点事儿
  6. 病毒详解及批处理病毒制作:自启动、修改密码、定时关机、蓝屏、进程关闭...
  7. AcWing 853. 有边数限制的最短路(bellman的k边限制最短路)
  8. Leetcode题medium48/54/55/56/59/62/63/64,Python多种解法(四)
  9. eclipse快捷键(alt+/)不起作用的解决办法
  10. 国际贸易结算-信用证流程图
  11. 青海计算机三级成绩查询,2013青海计算机三级成绩查询系统
  12. PHPer都应该关注的服务端性能问题–听云Server试用笔记
  13. 年度盘点!Flink 社区全年的精华内容都在这里啦(内附福利)
  14. Touch screen
  15. Cortex-M3/M4芯片启动流程概括
  16. Oracle11g在虚拟机win7上的详细安装过程(包括win7在虚拟机上的安装)
  17. mysql 密码忘记办法
  18. 滴滴程序员被亲戚鄙视:年薪八十万不如二本教书的……
  19. uni-app和vue什么关系?
  20. 电脑待办事项提醒小工具下载

热门文章

  1. mysql frm 没有myd_为什么MySQL表只对应一个.frm文件,没有.MYD和.MYI文件_MySQL
  2. burp绕过验证码爆破
  3. gps在linux读取数据,v3s Linux中读取GPS数据。
  4. java外呼接口案例_智能外呼回调HTTP接口规范
  5. java 健身房会员管理系统设计
  6. ssm经济信息门户网站 毕业设计源码141634
  7. python启动应用程序 mac_如何使用Python在Mac OS X上的前台启动应用程序?
  8. 邮件审批工作流实现方案
  9. 用python做科学计算的好处_使用Python做科学计算初探(转)
  10. 安徽省安庆市谷歌卫星地图下载