二分查找的Java实现「建议收藏」

目录写在前面二分查找的原理代码实现学习感想写在前面二分查找是一个很有趣的算法,可以很大程度的提升性能,比如待查询的数组或其他集合很大的时候,二分查找的威力就可以体现出来。但是平时的工作中我们基本上不会去写二分查找,所以我觉得有必要写一篇博文来记录二分查找的学习。二分查找的原理所谓二分查找,其实就是获取一组有序数据的中间数据,判断其跟查询关键字的…

大家好,又见面了,我是你们的朋友全栈君。

目录

写在前面

二分查找是一个很有趣的算法,可以很大程度的提升性能,比如待查询的数组或其他集合很大的时候,二分查找的威力就可以体现出来。但是平时的工作中我们基本上不会去写二分查找,所以我觉得有必要写一篇博文来记录二分查找的学习。

二分查找的原理

所谓二分查找,其实就是获取一组有序数据的中间数据,判断其跟查询关键字的大小,然后得到新的查找区间,继续重复以上的操作,直到最后查询区间不存在或者查询到关键字的下标。这样说起来可能还是有点抽象。So,Talk is cheap, Show me the code!

代码实现

/** * Author : Ray * Created At : 2018-03-13 下午8:41 * Email : ryu18356@gmail.com * Description : 二分查找的实例程序 */
public class BinarySearchDemo { 
   

    /** * 二分查找key值对应的下标 * @param source 输入的源数组 ,请保证为一个有序数组 * @param key 需要查找的值 * @return 正数为查找到的坐标,-1表示没有查到 */
    public static int binarySearch(int[] source, int key) {
        int low = 0;
        int high = source.length - 1;
        while (low <= high) {
            int mid = ( low + high ) >>> 1; //使用位移运算法高效地获取折中下标,这里不考虑符号,所以使用>>>
            int midVal = source[mid];
            if ( midVal < key ) {
                low = mid + 1;
            } else if ( midVal > key ) {
                high = mid - 1;
            }  else
                return  mid;
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] source = new int[]{
  
  12,213,232,343,123,-1,123,232424,1253,56,456,234,-2342};
        //保证数组为有序数组
        Arrays.sort(source);
        //打印排序后的数组元素
        System.out.print("Sorted Source : ");
        for (int i = 0; i < source.length; i++) {
            System.out.print(source[i] + " ");
        }
        System.out.println();
        System.out.println(binarySearch(source, 56));
    }

}

最后的运行效果为下图
result

学习感想

其实如果对Java SDK的源码熟悉的话,会一眼看出上面的二分查找其实就是仿写的Arrays.java的binarySearch方法,下面是源码的二分查找

 // Like public version, but without range checks.
    private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                     int key) {
        int low = fromIndex;
        int high = toIndex - 1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            int midVal = a[mid];

            if (midVal < key)
                low = mid + 1;
            else if (midVal > key)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found.
    }

可以看出我们最上面的例子其实就是借鉴Java源码的,Arrays类提供了很多便捷高效的方法,比如sort排序等。最后说一下,二分查找这种我们平时并不会写出来用,因为SDK已经给我们提供了实现。但是我们应该在空闲时间多多关注一下Java源码的实现,毕竟这些都是编程届的巨人们的思想结晶。我们可以通过源码学习很多知识,比如数据结构与算法,设计模式,面向对象编程技巧等,我坚信大多数大牛们之所以牛,就是因为源码读的多,写得多。当然那种天马行空的天才除外!所以,作为平凡人的我们应该掌握一些缩短我们与大牛差距的学习技巧,不要让好的学习资源((ps: 开车我是拒绝的!哈哈:))安静地待在我们的硬盘里。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简述热电偶和热电阻的区别(热电偶与热电阻的主要区别)

    1,热电偶英文Thermocouple,简称TC,工作原理是:随着温度变化输出线性毫伏信号。仪表将信号放大换算为温度信号。  2,热电阻英文Resistance简称RTD工作原理是:电阻值随着温度变化而发生线性变化。  3,温度变送器可以将热电偶mV电压信号或者热电阻的电阻值信号转换成4-20mA标准信号供自动化系统控制用。4,一般而言热电阻比热电偶便宜。…

    2022年4月17日
    39
  • java json转换为对象_Java list map

    java json转换为对象_Java list mapjson转map的六种方式

    2022年9月8日
    0
  • Java8 Lambda表达式详解手册及实例「建议收藏」

    Java8 Lambda表达式详解手册及实例「建议收藏」先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号“程序新视界”,好好系列的学习一下Java8的新特性。Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了。现在进入正题Java8的Lambda,首先看一下发音([ˈlæmdə])表达式。注意该词的发…

    2022年7月8日
    21
  • RST报文详解_modbus网关使用方法

    RST报文详解_modbus网关使用方法我们知道TCP建立连接的时候需要三次连接,TCP释放连接的时候需要四次挥手,在这个过程中,出现了很多特殊的标志报文段,例如SYNACKFIN,在TCP协议中,除了上面说了那些标志报文段之外,还有其他的报文段,如PUSH标志报文段以及今天需要重点讲解的RST报文段。RST:(Resettheconnection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到R…

    2022年10月1日
    0
  • 菜单权限表sql语句「建议收藏」

    菜单权限表sql语句「建议收藏」selectm.*     fromt_menum     wherem.state=’1′      and((menu_type=1andexists        (select1          fromv_user_menub          wherem.menu_id…

    2025年6月13日
    1
  • Aegis 简介_aegisthus

    Aegis 简介_aegisthus是一个数据绑定API,用于在Java对象与XML文档之间执行映射。使用Aegis的好处:Aegis使用外部映射文件为开发人员提供更多的控制权和灵活性,使他们能够根据其项目需要来定制映射。A

    2022年8月2日
    11

发表回复

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

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