浏览器标题切换
浏览器标题切换end

二分查找的三种写法

二分查找概念

二分查找:是一种在有序数组中查找某一特定元素的搜索算法。

这种搜索算法每一次比较都使搜索范围缩小一半。

写法一

根据定义:

public static int binary(int[] a,int data)
{
    int mi=0,ma=a.length-1,mid;
    while(mi<=ma)
    {
        mid=(mi+ma)/2;
        if(a[mid]>data) ma=mid-1;
        else if(a[mid]<data) mi=mid+1;
        else return mid;
    }
    return -1;
}

写法二

对于写法一而言,第8行代码会出现bug:mid=(min + max)/2;
这句代码在 min 和 max 很大的时候,会出现溢出的情况,从而导致数组访问出错。
进行改进:将加法变成减法。

public static int binary(int[] a,int data)
{
    int min=0,max=a.length-1,mid;
    while(min<=max)
    {
        mid=min+(max-min)/2; // 防止溢出
        if(a[mid]>data) max=mid-1;
        else if(a[mid]<data) min=mid+1;
        else return mid;
    }
    return -1;
}

写法三

利用位运算(官方的二分搜索法的实现写法)

public static int binary(int[] a,int data)
{
    int mi=0,ma=a.length-1,mid;
    while(mi<=ma)
    {
        mid=mi+((ma-mi)>>1); // 无符号位运算符的优先级较低,先括起来
        if(a[mid]>data) ma=mid-1;
        else if(a[mid]<data) mi=mid+1;
        else return mid;
    }
    return -1;
}
posted @ 2019-07-28 14:02  抓水母的派大星  阅读(461)  评论(0编辑  收藏  举报