Java二分查找算法详解

Java二分查找算法详解二分查找引言什么是二分二分的定义及二分查找算法的思路二分定义二分查找算法的思路二分查代码具体实现伪代码实现代码引言假如给你一个有序数组 然后给你一个数 让你去数组中找出该元素 如果数组中存在该元素 则返回该数在数组中的下标 如果不存在则返回 1 如果是你 你会怎么做 给你三秒钟时间考虑 1 2 3 时间到 是顺序查找吗 写一个循环 遍历整个数组去和目标数比较 那如果数据量很大 而且需找到的数在数组的最后面 那是不是太慢了 比如一个从 0 开始到 9999 的数组 我要查找 9999 这个数 是不是要比较 9999

引言

假如给你一个有序数组,然后给你一个数,让你去数组中找出该元素。如果数组中存在该元素,则返回该数在数组中的下标,如果不存在则返回-1
如果是你,你会怎么做?给你三秒钟时间考虑,1、2、3,时间到。
顺序查找吗?写一个循环,遍历整个数组去和目标数比较?那如果数据量很大,而且需找到的数在数组的最后面,那是不是太慢了?比如一个从0开始到9999的数组,我要查找9999这个数,是不是要比较9999+1次,才能得出9999所在的下标?有没有更简单的方法找出?
有,不要忘记我们的另一个条件,数组是有序的,对于有序的数组我们可以使用二分查找,又称对半查找折半查找等等,虽然别名很多,但实现原理都是一样的。






什么是二分

二分查找,顾名思义,这种算法的精髓就在于二分那什么是二分?它又是怎么实现二分的呢?

二分的定义及二分查找算法的思路

二分定义

二分就是每次把当前需要寻找的数组分成两半,那么我需要寻找的这个数只可能在左半边,或者右半边,这样一来我每次分完,所需要查找的元素的个数就是上一次查找元素个数的一半

比如[1 ,4, 9, 15, 27, 49, 128, 157]这个数组,我第一次把元素以27为中点,分为左边4个,右边3个。然后再查找,我们以左边为例,左边4个元素我们以9为中点分割,分为左边2两个元素,右边一个元素。。。。直至分割到元素只有一个时结束。

二分查找算法的思路

二分查代码具体实现

伪代码

/* * 二分查找 * arr输入数组 * x目标值 * left二分左边界 * right二分右侧边界 */ public static int binarySearch(int[] arr, int target , int left , int right) { 
    //判断是否已经到达出口--即元素不存在当前需判断的数组元素中 //找出中间的值的下标 //判断目标值在当前值的左侧还是右侧  //在左侧则对左侧执行二分法查找 //在右侧则对右侧执行二分法查找 //若当前中点值就是目标值则结束方法 返回结果 } 

实现代码

/* * 二分查找 * arr输入数组 * x目标值 * left二分左边界 * right二分右侧边界 */ public static int binarySearch(int[] arr, int target , int left , int right) { 
    /* * 目标值比最左侧的小 或者 比如数组为[1,6,9,14] 找-1 就会结束查找 * 目标值比最右侧的大 或者 比如数组为[1,6,9,14] 找18 就会结束查找 * 左侧下标大于右侧下标 比如数组为[1,6,9,14] 找4 就会结束查找 * */ //判断是否已经到达出口--即元素不存在当前需判断的数组元素中 if(target < arr[left] || target > arr[right] || left > right){ 
    return -1; } //找出中间的值的下标 int mid = (left + right)/2; //判断目标值在当前值的左侧还是右侧  if(arr[mid] > target && left <= right) { 
    //递归左侧 return binarySearch(arr,target , left , mid-1); }else if(arr[mid] < target && left <= right) { 
    //递归右侧 return binarySearch(arr,target, mid+1 , right); }else { 
    //目标值与中点值相等 return mid; } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219854.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:44
下一篇 2026年3月17日 下午9:45


相关推荐

  • document.all(“”)的使用

    document.all(“”)的使用document.all(name)         document.all(“”)的使用                                   varone=document.all(“one”);          alert(one.length);//单个元素时,不

    2022年7月12日
    15
  • IDEA2021 3.1 激活码(最新序列号破解)

    IDEA2021 3.1 激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    988
  • mysql日期格式化 yyyymmdd_mysql中时间日期格式化

    mysql日期格式化 yyyymmdd_mysql中时间日期格式化这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:DATE_FORMAT(FROM_UNIXTIME(‘1997-10-0422:23:00′),’%Y/%m/%d’)mysql>SELECTsomethingFROMtableWHERETO_DAYS(NOW())-TO_DAYS(date_col)<=30;DAYO…

    2022年5月29日
    135
  • VMware 彻底删除虚拟机操作系统的方法

    VMware 彻底删除虚拟机操作系统的方法方法一 1 选中要删除的虚拟机操作系统 单击右键 选择 管理 选项 2 然后在选择 从磁盘中删除 选项即可删除该虚拟机操作系统 方法二 1 选中要删除的虚拟机操作系统 选择 VMware 软件最上方的 虚拟机 选项 2 然后选择 管理 选项 3 然后选择 从磁盘中删除 选项即可删除该虚拟机操作系统

    2026年3月18日
    1
  • VBA 数组定义,赋值,一维数组

    VBA 数组定义,赋值,一维数组1VBA 数组的基础定义 1 1 什么是数组 就是一组数 字符等用同一个名字 这个名字就是 数组名 作为一个整体存储在一起 1 2 什么是元素这些被保存在同一个数组名下的 多个内容 称为 element 元素 数组里的元素是可以重复的 1 3 元素是怎么在数组内排序的 数组是有序的 用什么来标识顺序呢 就是 index index 是一串连续的整数 也可以为负数 index 必须

    2026年3月18日
    3
  • Mac 计算机的日常使用 和 从零开始搭建Python开发环境

    Mac 计算机的日常使用 和 从零开始搭建Python开发环境Mac计算机的日常使用和从零开始搭建Python开发环境本文作者:魏泯效率魔法师,最后更新时间:2019年1月10日在进行学习mac常用操作的时候,保证你的mac已经连接网络。目录&#

    2022年7月6日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号