一个90%的程序员写不对的程序,一个面试高频出现的面试题,一个开发中用之甚广的算法,一个最能体现程序员素质的代码,它就是二分查找。

一、二分查找的定义

【百度百科】二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找法充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。

二、二分查找的实现

//二分查找普通实现
public static int binarySearch(Integer[] srcArray, int des) {//定义初始最小、最大索引int start = 0;int end = srcArray.length - 1;//确保不会出现重复查找,越界while (start <= end) {//计算出中间索引值int middle = (end + start)>>>1 ;//防止溢出if (des == srcArray[middle]) {return middle;//判断下限} else if (des < srcArray[middle]) {end = middle - 1;//判断上限} else {start = middle + 1;}}//若没有,则返回-1return -1;
}
    /*** 二分查找递归实现。* @param srcArray  有序数组* @param start 数组低地址下标* @param end   数组高地址下标* @param key  查找元素* @return 查找元素不存在返回-1*/public static int binSearch(int srcArray[], int start, int end, int key) {int mid = (end - start) / 2 + start;if (srcArray[mid] == key) {return mid;}if (start >= end) {return -1;} else if (key > srcArray[mid]) {return binSearch(srcArray, mid + 1, end, key);} else if (key < srcArray[mid]) {return binSearch(srcArray, start, mid - 1, key);}return -1;}

三、二分查找的工作原理

  • 将数组分成两半,并确定要查找的内容(称为搜索键)是在左半部分还是在右半部分。
  • 你如何确定搜索关键字是哪一半?这就是为什么您首先对数组进行排序的原因,以便您可以进行简单<>比较。
  • 如果搜索键位于左半部分,则重复该过程:将左半部分分成两个更小的部分,然后查看搜索键必须位于哪个部分。(同样,当它是右半边时。)
  • 这一直重复直到找到搜索关键字。如果阵列无法再分割,您必须遗憾地断定搜索键不在阵列中。

现在你知道它为什么称为“二分”查找:在每一步中,它将数组分成两半。这个分而治之的过程就是让它能够快速缩小搜索关键字的位置。


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://baike.baidu.com/item/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/10628618?fr=aladdin
  2. https://blog.csdn.net/lovesummerforever/article/details/24588989
  3. https://www.jianshu.com/p/0f823fbd4d20
  4. https://www.jianshu.com/p/31663d8dd912

程序员的算法课(4)-二分查找相关推荐

  1. java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...

    本文来讲一种搜索算法,即二分搜索算法,通常在面试时也会被问到. 我们先来看一个例子,在图书馆通常是根据查到的编号去找书,可以在书架上按顺序一本本地查找,也可以找到一本书不符合预期时,再跳过一大部分书再 ...

  2. 视频教程-程序员必备算法课!(揭秘淘宝购物车算法)-机器学习

    程序员必备算法课!(揭秘淘宝购物车算法) CSDN讲师名下集合了诸多业界知名讲师的公开课内容,内容涵盖人工智能.大数据.区块链等诸多热门技术领域的最佳技术实践,聚合美团.滴滴.AWS.科大讯飞等知名企 ...

  3. 程序员的算法课(2)-排序算法

    术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由于数 ...

  4. 程序员的算法课(11)-KMP算法

    一.KMP算法定义 [百度百科]KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法). ...

  5. 程序员的算法课(12)-使用通配符*,?等来查找字符串

    一.前言 相信大家都用过文本编辑器(EditPlus,notepad++,sublime..).Word或者开发IDE工具(IDEA,Eclipse..):甚至于你应该也写过不少SQL语句:你也用过百 ...

  6. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  7. 程序员的算法课(9)-常见字符串算法

    一. 字符串排序算法 1. 低位优先(Least-Signifcant-Digit First,LSD) 该算法要求被排序的每个字符串长度都相等.它会把字符串当成数字,从字符串的右边开始向左检查字符( ...

  8. 程序员的算法课(8)-贪心算法:理解霍夫曼编码

    一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...

  9. 程序员的算法课(3)-递归(recursion)算法

    一.什么是递归 递归是一种数学上分而自治的思想. 递归将大型复杂问题转化为与原问题相同但规模较小 的问题进行处理 递归需要有边界条件,当边界条件不满足时,递归继续进行:当边界条件满足时,递归停止 [百 ...

最新文章

  1. 串口初始化结构体和固件库讲解
  2. python—多线程之数据混乱问题
  3. 才子佳人文学传统的戏拟与嘲仿
  4. html页面之间传参乱码,急求教,在两个htm页面传参数时中文出现了乱码,试了网上的方法不管用。_html/css_WEB-ITnose...
  5. Intel汇编语言程序设计学习笔记1
  6. xcode配置最新版opencv
  7. 如何为ip v6设定子网
  8. 合肥师范学院2020年专业计算机是多少分,合肥师范学院2020年安徽省一本、二本各专业录取分数统计...
  9. 开发流程与管理--华为硬件开发
  10. QWidget_层级关系
  11. 信息科采购服务器可行性,与HP合作 南方医院PACS系统创新效益
  12. ArcGIS许可服务管理器无法启动问题
  13. java nio wakeup_Java NIO 的 wakeup 剖析
  14. 经典再现,看到就是赚到。尚硅谷雷神 - SpringBoot 2.x 学习笔记 - 核心功能篇
  15. excel填充序列_excel填充序列不见了怎么办-excel
  16. java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)
  17. python爬实时数据_如何用python爬取实时更新的动态数据?
  18. 如何将CentOS Stream退回为CentOS 8.5
  19. 计算机考试的雷区,驾照场考技巧与科目三电子路考雷区整理
  20. 增加ceph mon节点

热门文章

  1. Matrix学习——基础知识
  2. 满足StrataFlash嵌入式存储器要求的LDO应用电路
  3. Redis如何做内存优化?
  4. 分布式事务实践 解决数据一致性 分布式事务实现:Event Sourcing模式
  5. async/await和Promise区别
  6. 大数据处理工具Kafka、Zk、Spark
  7. Java高并发编程详解系列-JVM类加载器
  8. python3.3 连接mysql_python3.3连接mysql数据库
  9. Ballast,一种精准控制 Go GC 提高性能的方法
  10. IDEA常用插件整理