二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序。

先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid把这个数组分为两半,前一半从下标0到mid-1,后一半从mid+1到数组最后一个元素(下标是数组长度减一)。把这个查找的元素key和数组下标为mid的元素进行比较,也就是和中间那个元素进行比较,如果比这个元素的小那么把查找范围缩小到原数组的前一半(把查找下标缩短到0到mid-1),如果比中间mid下标元素大那么范围就是后半部分(下标为mid+1到数组长度减一),这样来回反复取中间比较最后就会定位到要查找元素key的下标。

二分查找有两种实现方式:

  1. 非递归实现
  2. 递归实现

在jdk源码中Arrays数组工具类中已经封装好了二分查找算法,不会写可以看看源码,源码实现的方式肯定是效率比较高的。比如计算数组中间下标mid利用移位运算。

非递归实现:

/*** @param array 操作数组* @param key 查找元素* @return 元素下标*/public static int binSearch(int[] array,int key){int start=0;int mid;int end=array.length-1;while(start<=end){mid=(end-start)/2+start;if(key<array[mid]){end=mid-1;}else if(key>array[mid]){start=mid+1;}else{return mid;}}return -1;}

递归实现:

/*** @param array 操作数组* @param key 查找元素* @param start 开始下标* @param end 结束下标* @return 元素下标*/public static int binSearch1(int[] array,int key,int start,int end){int mid=(end-start)/2+start;if(key==array[mid]){return mid;}else if(start>=end){return -1;}else if(key>array[mid]){return binSearch1(array,key,mid+1,end);}else if(key<array[mid]){return binSearch1(array,key,start,mid-1);}return -1;}

二分查找算法的两种实现方式:非递归实现和递归实现相关推荐

  1. python实现二分查找算法_两种方法实现Python二分查找算法

    一. arr=[1,3,6,9,10,20,30] def findnumber(l,h,number): mid=(l+h)//2 if arr[mid]==number: print(" ...

  2. 20210408:力扣(二分查找法的两种写法以及变体题目)

    二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...

  3. 二分查找算法python实现_Python实现-二分查找算法(3种方法)

    如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? lst = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, ...

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

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

  5. 二分查找算法(随机, 最左, 最右)

    二分查找算法 1. 普通二分查找 2.二分查找最左(第一次出现) 二分查找最左模板题 3.二分查找最右(最后一次出现) 4.二分查找练习题 1.定义 二分查找算法是一种效率较高的查找算法,每次查找能把 ...

  6. 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...

  7. a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)

    串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...

  8. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...

    原创: 进击的HelloWorld1 引言遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点 ...

  9. c++层次遍历_数据结构与算法,弄懂图的两种遍历方式

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.  在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则, ...

最新文章

  1. 阿里云云盾-智能风控(公测)发布
  2. oracle索引中丢失in或out参数,oracle 11g给表建触发器错误“索引中丢失 IN 或 OUT 参数:: 1...
  3. 阿里巴巴Java开发手册-使用JDK8的Opional类来防止出现NPE问题
  4. 专利计算机存储介质是智力活动,涉及计算机程序的发明专利申请的相关问题PPT课件.pptx...
  5. 如何优雅地管理C++ 中的内存
  6. 去哪儿网2018春招软件开发工程师、前段开发工程师编程题 - 题解
  7. 三菱plc字高八位和低八位_三菱PLC如何传送高8位和低8位数据
  8. spring云化架构迁移 (一)
  9. TIA博途_如何更新程序中的指令版本和CPU固件版本?
  10. HTML网页设计期末课程大作业 ---H5移动端电商购物网页设计35页面(包括主页,商品详情,转账,付款,购物车等页面) 功能齐全
  11. macos显卡测试软件,GpuTest显卡测试软件 for Mac 64位
  12. 高等数学学习笔记——第四十讲——微积分基本公式
  13. usart hmi(串口屏)介绍
  14. Appium自动化框架从0到1之 测试用例封装
  15. Java Ucase_JSP页面中的变量和方法声明(Declaration)、表达式(Expression)和Java程序片(Scriptlet)统称为JSP标记。...
  16. Minecraft 1.12.2模组开发(十九) 自定义3D物品模型
  17. 动图设置动图设置动图设置
  18. 流行的软件测试工具介绍
  19. 地推脑30秒速装华为移动应用引擎,电脑也能玩安卓
  20. C#中关于WinForm中重绘TabControl选项卡标题的问题

热门文章

  1. leetcode 两数之和 整数反转 回文数 罗马数字转整数
  2. c++入门之运算符重载
  3. CentOS6.8下搭建zookeeper web界面查看工具node-zk-browser
  4. NOIP2010-普及组复赛模拟试题-第一题-手机
  5. android中可以使用bitmap的平铺,镜像平铺等减小图片带来的apk过大的问题
  6. 【Android】Handler详解
  7. Vim as Python IDE on windows(转)
  8. Junit实现接口类测试
  9. [导入]微软CSS,GCR半日游--学了一样东西,什么叫做灰头土脸
  10. 《Essential ASP.NET 2.0中文版》