二分查找

二分查找:在有序(升序或降序)的集合上,才能使用二分查找。

二分查找的思路:

在一个有序数组中查找一个数 n,我们可以把 n 与 数组的中间元素(mid)不断的去比较,

​ 若 n < arr[mid], 说明数字 n 在左区间,则数组右侧的索引变为 mid-1,左侧的索引加1

​ 若 n > arr[mid], 说明数字 n 在右区间,则数组左侧的索引变为 mid+1,右侧的索引加1

​ 当 ==n = arr[mid]==时,在数组中找到了这个数字

数组的左侧索引(left) 大于 右侧索引(right),就把这个数组都找了一遍,没有找到这个数。

循环条件是 left <= right,为什么需要加等于呢,当下标都相等时,数组内还有一个元素。

图解

查找数字11

第一步:

11 > arr[mid] ,

第二步:数字在数组 的右区间,left = mid +1;

就这样一直进行比较


代码如下:

import java.util.Scanner;public class PublicTwoFind {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10,11};twoFind(arr,0,arr.length-1,11);int find = 1;int left = 0;  //数组最左侧元素的下标int right = arr.length-1; //数组最右侧元素的下标while(left <= right){   //终止条件int mid = (left + right)/2; //得到数组中间元素下标if(find < arr[mid]){right = mid - 1;}else if(find > arr[mid]){left = mid + 1;}else { //find == arr[mid]System.out.println("找到了,下标是:" + mid);break;}}if(left > right){System.out.println("找不到这个数");}}/**mid 表示中间元素的下标*终止条件是 当left > right,表示没有这个数,结束方法*         当num == arr[mid],表示找到了这个数,打印mid * 拆分问题:比较num 和arr[mid] 的大小,* 若 num > arr[mid],则在[mid + 1,right]的数组范围内查找,此时mid+1 就是新的left* 或 num < arr[mid],则在[left,mid -1]的数组范围内查找,此时mid -1 就是新的right;* 接着在新的数组范围内继续比较,直到遇到终止条件**假设查找数字的函数已经写好,我们只需要在判断num是否大于中间元素,然后调用函数,就可以得到这个数字下标**@param arr    查找的数组* @param left   数组的右侧下标* @param right  数组的左侧下标* @param num    查找的数字*///递归的写法public static void twoFind(int[] arr,int left,int right,int num){if(left > right){System.out.println("没有这个数");return;}int mid = (left + right)/2;if(num == arr[mid]){System.out.println("1找到了,下标是:" + mid);return;}else if(num > arr[mid]){twoFind(arr,mid + 1,right,num);return;}twoFind(arr,left,mid - 1,num);}
}

要是对大家有所帮助的话,请帮我点个赞吧。

【二分查找详解外加递归写法】附有全部代码相关推荐

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

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

  2. 二分查找详解(Java)

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

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

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

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

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

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

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

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

  7. 你是真的“C”——详解函数递归+求解青蛙跳台阶问题

    详解函数递归运用+求解青蛙跳台阶问题

  8. educoderpython答案计算机问题之递归第一关_Python练习题详解之递归(小白友好)...

    Python练习题详解之递归(小白友好) 你好!欢迎来到Python练习题详解系列.为了让小白(也就是我本人)更好的理解代码,打好编程基础,我决定仔细地解说一些练习题.欢迎阅读!奥利给! 首先,我们来 ...

  9. educoderpython答案计算机问题之递归_educoderpython答案计算机问题之递归第一关_Python练习题详解之递归(小白友好)......

    Python练习题详解之递归(小白友好) 你好!欢迎来到Python练习题详解系列.为了让小白(也就是我本人)更好的理解代码,打好编程基础,我决定仔细地解说一些练习题.欢迎阅读!奥利给! 首先,我们来 ...

最新文章

  1. java学习之—实现一个简单的ArrayList
  2. qt qml scrollbar 移动APP风格的滚动轴
  3. 在没有工具的情况下检查SSD 的TRIM功能有没有打开
  4. python分糖果_分糖果_平安科技笔试题_牛客网
  5. Linq 实现 DataTable 行转列
  6. ecshop goods.php,重命名ecshop的商品页goods.php为shangpin.php
  7. 选择Java加密算法第3部分–公钥/私钥非对称加密
  8. Linux监控服务并主动重启
  9. VirtualBox 上安装Debian 后分辨率设置
  10. python查看继承方法(一分钟读懂)
  11. jQuery mobile网格布局
  12. Android Scroller类的详细分析
  13. unity--------------------四元数的旋转与原理
  14. 上海计算机短期培训,上海日语短期培训速成班
  15. .pos文件打开方式
  16. 人生的意义在于梦想和坚持
  17. 2021年高压电工考试技巧及高压电工模拟考试
  18. dwg如何转换成pdf格式?
  19. 妈妈说就算你注册的域名再长GOOGLE都能搜索出来,百度也有妈妈!
  20. 基于junit4的关于个人所得税计算的等价类与边界值_关于量子力学的基本原理

热门文章

  1. c语言考试的说说带图片致自己,说说带图片致自己励志2020
  2. 希玛 AR907C绝缘电阻测试仪基本实验
  3. win10设置虚拟内存_原来win10这样设置,电脑就能释放30G,比win7运行还顺畅
  4. 计算机一级dbf,计算机一级MSOffice模拟试题(8)
  5. 电影常见版本(CAM、TS、TC、DVDSCR、DVDRIP等)简单介绍
  6. 高等代数习题课(手写)
  7. 计算机键盘指示灯不亮也不启动不了机,电脑开机时滴滴响 开不了机,显示器显示无信号,键盘灯不亮...
  8. 智能人体存在感知方案,毫米波雷达感应器成品,智能化感知联动应用
  9. 基于深度学习的遥感应用
  10. 西南科技大学数据库实验一