二分查找-平衡板

74 阅读1分钟

问题的引出代码如下

public static void main(String[] args)
    {
        int arr[] = {1, 2, 3, 4, 5};
        int refen = Refen(arr, 4);
        System.out.println(refen);
    }

    private static int Refen(int arr[], int value)
    {
        int left = 0;
        int right = arr.length - 1;
        int mid = 0;
        // 循环次数为 L 次 , 问题是里面的if else if 判断了多少次
        // 左边找元素,如果第一个if 成立了,那么第二个if 就不会执行了
        // 右边找元素,如果第二个if 成立了,那么第一个if 也会被执行
        // 现在的问题就是,左边 找元素 和 右边找元素并不是平衡的
        // 向左找成本低,只需要比较一次。向右找成本高,需要比较两次
        while(left < right)
        {
            mid = (left + right) >> 1;
            if(arr[mid] < value)
            {
                left = mid + 1;
            }else if(arr[mid] > value)
            {
                right = mid - 1;
            }else
            {
                return mid;
            }
        }
        return -1;
    }

优化后的代码如下:

public static void main(String[] args)
    {
        int arr[] = {1, 2, 3, 4, 5};
        int i = lineSearch(arr, 3);
        System.out.println(i);
    }
    private static int lineSearch(int arr[], int value)
    {
        int i = 0;
        int j = arr.length;
        int mid = 0;
        // j - 1代表 待查找的元素个数
        while(1 < j - i)
        {
            mid = (j + i) >>> 1;
            // 中间值小于目标值时满足条件
            if(arr[mid] < value)
            {
                i = mid;
            }else
            {
                j = mid;
            }
        }
        if(arr[j] == value)
        {
            return j;
        }else
        {
            return -1;
        }
    }