二分查找

173 阅读1分钟

编写二分查找代码

  • 1.前提:有已排序数组 A(假设已经做好)
  • 2.定义左边界 L、右边界R,确定搜索范围,循环执行二分查找 (3、4两步)
  • 3.获取中间索引 M= Floor((L+R)/2)
  • 4.中间索引的值 AIMI与待搜索的值T进行比较
    • A[M]==T 表示找到,返回中间索引
    • A[M]>T,中间值右侧的其它元素都大于,无需比较,中间索引左边去找,M -1设置为右边界,重新查找
    • A[M]<T,中间值左侧的其它元素都小于T,无需比较,中间索引右边去找,M+1设置为左边界,重新查找
  • 5.当L>R时,表示没有找到,应结束循环
public class BinarySearch {
    public static void main(String[] args) {
        // 1.定义一个按顺序排序的数组
        int[] a = {1,8,10,15,17,19,25,29,64,100,182,200};
        int target = 17;
        System.out.println(binarySearch(a, target));
    }
    // 二分查找方法,找到元素所在索引
    public static int binarySearch(int[] a, int i){
        // 定义 左边界,右边界
        int l = 0;
        int r = a.length - 1;
        while (l <= r) {
            // 找到中间位置的索引位置
            int m = (l + r) / 2;
            if(a[m] == i) {
                return m;
            } else if (a[m] > i) {
                r = m - 1;
            } else if (a[m] < i) {
                l = m + 1;
            }
        }
        return -1;
    }
}

mid值溢出问题

在上诉方法中求mid值得时候,可能会造成 mid值溢出,从而导致最后的结果是负数。

解决方案1:

m = (l + r) / 2    ====>     m = (l / 2) + (r / 2)   =======>  m = l + ( -l / 2 + r / 2)  =====>     m = l + (r - l)/2;

解决方案2:

位运算 也是防溢出 无符号位元素符的优先级较低,所以括起来

m = (l + r) >>> 1