关于快速查找法(折半/二分查找法)解释(一次记住)binarysearch

关于快速查找法(折半/二分查找法)解释(一次记住)binarysearch

简单说就是折半再折半,很内容理解。

目的:看一次,永远记住。(妈妈再也不用担心我不会写查找了)

难点:low,high操作。

    @Test
    public void binarySearch() {
        //数组一定要是顺序的。
        double arr[] = {0.0, 0.001, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0, 3.0}
        double key = 0.3;
        int low = 0;
        int high = arr.length - 1;

        while (low <= high) {
            int mid = (low + high) / 2;
            double midVal = arr[mid];

            if (key > midVal)//大在high区,把low往上抬,砍掉low区
                low = mid + 1;
            else if (key < midVal)//小在low区,把high往下压,砍掉high区
                high = mid - 1;
            else {
                System.out.println(key + "的位置是" + mid); 
                return;//--------找到了退出
            }
        }

        System.out.println(-(low + 1));//没找到,返回负数
    }

当key大于的midVal的时候说明key在high区

low区的数据就放弃了,怎么放弃low区?直接把最low的位置指到mid的位置就行了,但还不够,还要多移一位才行(low=mid+1)。

这样取值的区间就变成high区的了mid+1的位置到high。然后再折半。这时可能跑过头了,再往回跑(high=mid-1)就行了。

只要记住key在高区就把low往上抬,key在低区就把high往下压就行了。(为什么要mid+1或者-1,不直接等于mid?因为mid已经和key比较过了)

核心就是解决low,high的操作,理解了这个操作,快速查找就不是问题。

 

简单粗暴

如图:其实就是排除法,不停的干掉区域,通过不停移动low和high的位置,收缩范围,最后找到。

关于快速查找法(折半/二分查找法)解释(一次记住)binarysearch

mid=(low+high)/2 或者牛逼刺啦带火花写成mid=(low+high) >>> 1

 

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

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

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


相关推荐

  • Android 绑定服务 bindService[通俗易懂]

    Android 绑定服务 bindService[通俗易懂]绑定服务是客户端–服务器接口中的服务器。组件(如activity)和服务进行绑定后,可以发送请求、接收响应、执行进程间通信(IPC)。不会无限期在后台运行。要提供服务绑定,必须实现onBind()回调方法,该方法返回的IBinder对象定义了客户端用来与服务进行交互的编程接口。客户端可以通过调用bindService()绑定到服务。调用时,必须提供ServiceConnection的实现,后者会…

    2022年6月10日
    35
  • Geth私链的多节点运行「建议收藏」

    Geth私链的多节点运行「建议收藏」前一阵分别介绍了在Ubuntu和CentOS下搭建基于Geth的以太坊私链,这篇文章介绍如何搭建Geth多节点的运行。提示:在Ubuntu和CentOS下搭建以太坊私链,请参考《在Ubuntu下使用Geth搭建自己的以太坊私有链》和《CentOS7下安装Geth,搭建以太坊私有链》一、在Windows下安装Geth为了方便测试,我在Windows下搭建了一个套Geth环境。安装方…

    2022年10月8日
    2
  • layui弹出层html,layer弹出层「建议收藏」

    layui弹出层html,layer弹出层「建议收藏」layer弹出层,怎么只让他弹出一次.在线等我昨天用这个插件的时候也有这个问题,弹出内容大了就居不了中。这是组件不完美的地方,他设置了top和left值,而且是固定的。这种弹出层都是绝对定位的所以没办法用margin:auto0神马的居中。解决方案主要两种:1.修改在浏览器里面调试模式。jquerylayer怎么弹出指定的html内元素一个基本的弹出层应该满足以下需CSS布局HTML小编…

    2022年7月13日
    15
  • linux之lvm分区扩容[通俗易懂]

    linux之lvm分区扩容[通俗易懂]以下步骤的前提为磁盘lvm分区1、加入新硬盘2、分区PV(physicalvolume)即物理卷,就是物理磁盘,可以通过fdisk-l查看操作系统有几块硬盘VG(volumegroup)即卷组,就是一组物理磁盘的组合,里面可以有一块硬盘也可以有多块硬盘LV(logicalvolume)及逻辑卷,就是在VG(指定的物理磁盘组)里面划分出来的可以说成是PV就是硬盘…

    2022年6月20日
    241
  • django1.8_django-vue-admin

    django1.8_django-vue-admin前言由于之前我们一直使用的django-rest-framework-jwt这个库,但是作者在17年的时候就已经不再维护了(有部分bug没有解决),所以我们也就不用了,目前我们使用django-r

    2022年8月7日
    6
  • javascript Date format(js日期格式化)

    javascript Date format(js日期格式化)这个很不错,好像是csdn的Meizz写的://对Date的扩展,将Date转化为指定格式的String//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q)可以用1-2个占位符,//年(y)可以用1-4个占位符,毫秒(S)只能用1个占位符(是1-3位的数字)//例子://(newDate()).Format(“yyyy-MM-ddhh:mm:ss.S”)==>2006-07-0208:09:04.423//(newDate())

    2022年4月30日
    38

发表回复

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

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