zoukankan      html  css  js  c++  java
  • 二分查找的三种写法

    二分查找概念

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

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

    写法一

    根据定义:

    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;
    }
    
  • 相关阅读:
    Intelligence System
    Hawk-and-Chicken
    The Stable Marriage Problem
    HDU 1173 采矿
    HDU 1018 Big Number 斯特林公式
    HDU 1005 Number Sequence
    ZOJ-3941 Kpop Music Party
    Codeforces 939 D Love Rescue
    Codefroces 939 C Convenient For Everybody
    Codeforces 935 C Fifa and Fafa
  • 原文地址:https://www.cnblogs.com/OFSHK/p/11258780.html
Copyright © 2011-2022 走看看