zoukankan      html  css  js  c++  java
  • 死磕算法之二分查找法

    学习更多算法系列请参考文章:死磕算法之汇总篇

    二分查找又称折半算法,此算法作为一个经典的查找算法是我们不得不掌握的算法

    这个算法查找的前提是查找的数据是有序的,我们以数组为例,使用二分查找法进行查找的时候我们应该先定义三个字段:

    1.left指向数组第一个数据

    2.right指向数组最后一个元素

    3.mid呢指向(left+right)/2位置的元素,就是他们中间的位置。

    当我们要在一个数组中查找一条数据a时,有这么几个步骤:

    1. 首先我们拿a与mid比较,如果a与mid相等那么我们就成功找到了这个数据,程序停止。
    2. 如果a比mid小进行第3步,如果a比mid大进行第4步
    3. 既然a小于mid,那么mid与right之间的数肯定比a大,所以我们忽略它们,紧接着把right指向mid的前一个位置。(你可能会问为啥指向前一个位置不指向mid呀,因为我们已经确定了mid不等于a,那么我们就不需要在比较他了)
    4. 既然a大于mid,那么mid与left之间的数肯定比a小,所以我们忽略它们,紧接着把left指向mid的后一个位置。(不明白可以参考3哦)
    5. 如果left不大于right那么我们就还没有查找完毕,继续进行第一步。如果left已经大于了right,那么就代表在这个数组里我们没有找到想要的数据。

    建议对二分查找不太熟悉的同学可以先在草稿纸上、电脑上或者脑海里定义一个0-16的有序数组跟着上边的步骤来查找一下数据5。

    下面这个图是我画的图,来看一下跟你画的步骤或者想象的步骤一样么

    如果上图你已经看明白了的话那么接下来我们就上代码吧,

    public static void select(int[]num,int a){
        int left=0;
        int right=num.length-1;
        int m=(left+right)/2;
        while(left<=right){
            if(num[m]==a){
                System.out.println("在"+m+"位置找到");
                return;
            }
            if (num[m]>a){
                right=m-1;
            }else{
                left=m+1;
            }
            m=(left+right)/2;
        }
        System.out.println("没找到");
    }
    

    上面的方法使用了一个普通的循环的方式,二分还存在一种递归的写法,这里也分享出来

    public static void select(int[]num,int a,int left,int right){
        if(left>right){
            System.out.println("没找到");
            return;
        }
        int m=(left+right)/2;
            if(num[m]==a){
                System.out.println("在"+m+"位置找到");
                return;
            }
            if (num[m]>a){
                right=m-1;
                select(num, a,left,right);
            }else{
                left=m+1;
                select(num, a,left,right);
            }
    }
    
    

    二分查找法讲到这里已经讲完了。在这里温馨提示大家,学习算法时,我们没必要拘泥于代码的实现,那没有意义。我的建议就是深入理解步骤,当你理解步骤以后代码是随你怎么玩都可以的。

  • 相关阅读:
    if...else if switch分支结构
    Code大蛇丸 腾讯微博 key
    当GridView中的一项被点中的时候显示的背景图片:android:listSelector="@drawable/choose_gridview"
    手机通讯录
    JDOM和XPATH薛谷雨
    修改myEclipse8.5的默认的工作空间
    用JoyToKey使游戏手柄变键盘或鼠标
    在Spring3中,配置DataSource的方法有五种
    Struts+spring使用随机验证码
    项目部署不到tomcat中的原因和解决方法
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9245649.html
Copyright © 2011-2022 走看看