目录

一、简介

二、查找思路

三、算法实现

四、总结


一、简介

二分法查找,是在已经排好序的序列中,定义一个起始位置start(即序列第一个元素)和一个终止位置end(即序列最后一个元素),通过mid=(start+end)/2计算出中间位置,通过待查找元素与mid中间位置的元素进行比较,如果待查找元素比中间位置mid对应的值小,那么将end = mid -1(即将end结束位置移动到mid中间左边一个位置),如果比中间对应的值大,那么将start = mid + 1 (即将start的位置移动到mid右边一个位置),一直循环查找,直到start > end,证明没找到对应的元素,停止循环。

二、查找思路

【a】待查找有序数组序列:1, 2, 3, 4, 5, 6, 7  

起始: 定义start = 0 , end = 6, mid = (start + end ) / 2 = (0 + 6) / 2 = 3,arr[mid] = arr[3] = 4

【b】假设需要查找"2", 因为2 < arr[mid] = arr[3] = 4; 所以需要将end移动到mid左边一个位置,即end = mid - 1 = 3 - 1 = 2,

此时重新计算mid = (start +end ) / 2 =  (0 + 2) / 2 = 1; arr[mid] = arr[1] = 2 ,继续将2与arr[mid] = arr[1] = 2进行比较,发现相等,成功找到数字"2"所在的位置。

【c】假设需要查找"7",因为 7 > arr[mid] = arr[3] = 4,所以需要将start移动到mid右边一个位置,即start = mid + 1 = 4,此时重新计算mid = (start +end) / 2 = (4+ 6)/2 = 5, arr[mid] = arr[5] = 6, 因为7>arr[mid] = arr[5] = 6,所以还是需要将start移动到mid右边一个位置,即start = mid + 1 = 5 + 1 = 6,  此时重新计算mid =  (start +end) / 2 = (6 + 6) / 2 = 6.arr[6] = 7, 此时arr[mid] = arr[6] = 7,刚好等于待查找数字7,说明成功找到数字"7"所在的位置.

【d】假设查找"0", 因为 0 <  arr[mid] = arr[3] = 4, 所以需要将end移动到mid左边一个位置,即end = mid - 1 = 3 - 1 = 2,此时重新计算mid = (start +end) / 2 = (0 + 2) / 2 = 1,arr[mid] = arr[1] = 2, 因为0 < arr[mid] = arr[1] = 2,所以需要将end移动到mid左边一个位置,即end = mid - 1 = 1 - 1 =  0, 此时mid = (start +end) / 2 = (0 + 0) / 2 = 0,arr[mid] = arr[0] = 1,因为0 < arr[mid] = arr[0] = 1,所以需要将end移动到mid左边一个位置,即end = mid - 1 = 0 - 1 = -1 ,因为此时start = 0, end = -1,start >end,即start 已经大于end结束位置,说明没有找到相应的元素0。

三、算法实现

public class BinarySearchUtils {/*** 根据指定值查找在数组中的位置** @param arr   待查找有序数组* @param value 指定值* @return 返回值在数组中对应的下标位置*/public static int binarySearch(int[] arr, int value) {//起始位置int start = 0;//结束位置int end = arr.length - 1;while (true) {//计算中间位置下标int mid = (start + end) / 2;//中间值int midValue = arr[mid];if (value == midValue) {return mid;} else {//待查找数值比中间值小,需要将end = mid - 1if (midValue > value) {end = mid - 1;} else {//待查找数值比中间值大,需要将start = mid + 1start = mid + 1;}}if (start > end) {//start > end,说明未找到相应的元素,返回-1return -1;}}}}

测试:

public class TestBinarySearchUtils {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7};int index1 = BinarySearchUtils.binarySearch(arr, 2);System.out.println(index1);int index2 = BinarySearchUtils.binarySearch(arr, 7);System.out.println(index2);int index3 = BinarySearchUtils.binarySearch(arr, 0);System.out.println(index3);}}

测试结果:

四、总结

本文是对二分查找算法的一些总结以及思路,仅供大家参考学习,一起学习一起进步。

Java常见算法之二分法查找算法详解相关推荐

  1. 【算法】二分法多种情况详解

    二分法多种情况详解 1.存在的问题 2.[left, right] 左闭右闭区间 a. 注意: b. 代码实现: c. 代码优化: d.示例: 69. x 的平方根 3. [left, right) ...

  2. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

  3. mysql实现二分法查找_算法之二分法查找

    二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中, 首先将给定值key与字典中间位置上元素的关键码(key)比较,如果 ...

  4. 算法问题:整数除法详解(Java方向)

    算法问题:整数除法详解(Java方向) 1.力扣题目 2.结果代码分析 3.完整的结果代码 4.代码出处和教学出处 5.博主 边学习边记录算法的学习 1.力扣题目 1.给定两个整数 a 和 b ,求它 ...

  5. 二分法查找算法(折半查找算法)

    二分法查找又叫折半法查找算法,就是在有序的数组内,找到特指的一个值.这里要注意有序,无序的话只能一个一个找了,正是因为有序,为了使程序跑的快,高效才有的二分法查找算法. 逻辑:(默认从小到大的顺序)指 ...

  6. 《算法导论》红黑树详解(一):概念

    在学习红黑树之前,读者应先掌握二叉查找树的相关知识.学习红黑树或者二叉查找树,推荐大家看<算法导论>.<算法导论>原书第3版 高清PDF 带详细书签目录下载 密码:acis & ...

  7. 【数据结构与算法】哈希算法的原理和应用详解!

    在程序员的实际开发中,哈希算法常常能用得到,本文以哈希算法的原理和应用为核心,和大家详细讲解一下哈希算法的概念.常见算法以及原理.在信息安全的应用等等. 一.概念 哈希表就是一种以 键-值(key-i ...

  8. python 查找算法_七大查找算法(Python)

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素. 查找表(Search Table):由同一类型的数据元素构成的集合 关键字(Ke ...

  9. 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

  10. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

最新文章

  1. Linux(9)用户、组和权限管理
  2. [patl2-018]多项式A除以B
  3. Java Nashorn--Part 3
  4. python 四足机器人运动学_撸了个四足机器人
  5. python装饰器应用论文_Python装饰器的应用场景代码总结
  6. 静态库.a和动态库.so的制作
  7. 基于tensorflow框架训练超像素subpixel模型
  8. 最大后验估计_极大似然估计 V.S. 贝叶斯估计
  9. 关于opencv中的imread()函数声明
  10. 计算机设计大赛南京邮电大学,喜讯:我校信息学子在中国大学生计算机设计大赛中再创佳绩...
  11. RecyclerView中的Item无法填充满的问题
  12. gluster集群服务器IP地址更改后导致服务无法启动的一个解决方法
  13. python excel画图哪个好_Python excel 画图
  14. Android百度地图,绘制,覆盖物,导航,定位,细腻分解!
  15. Windows中使用cmd查看磁盘及其格式
  16. 成都 顺兴茶馆 看变脸
  17. Win7系统下安装Python环境以及IDE开发环境(PyCharm)
  18. 图像处理:利用相似度处理相似度较大的图像
  19. SpringCloud知识总结
  20. 通过黑洞路由,模拟外部网络

热门文章

  1. Mac大文件分包split与合并cat,加密压缩zip
  2. C++ OS 网络 数据库 (面试)
  3. 558. 四叉树交集
  4. 113. 路径总和 II
  5. 数据库创建索引的规则
  6. 线性代数中一些有关秩的不等式
  7. nginx配置跨域对服务异常(包括404)时失效的解决
  8. springboot批量更新实体_springboot使用druid批量更新报错
  9. 关于Redis启动时报权限不够(-bash: /usr/local/bin/redis-server: Permission denied)
  10. 实现JPA的懒加载和无外键