【详解】二分查找改良版(内含java实现)

点击本链接先学习二分查找基础版

二分查找改良版算法思想

【详解】二分查找改良版(内含java实现)_第1张图片

算法实现

public static int binarySearchBalance(int a[],int target) {

        int i=0,j=a.length;

        while(j-i>1) {
            int m=(i+j)>>>1;
            if(target<a[m]) {
                j=m;
            }
            else {      //包括a[m]
                i=m;    //所以m不可以被排除了,i不能等于m+1
            }
        }
        if(a[i]==target){
            return i;
        }
        return -1;
    }

优缺点

优点:比较次数减少
缺点:无论目标值在数组的什么位置,循环的次数都不变,会一直运行直到j-i>1,即只剩余i这个位置的值有效之后退出

和之前的方法对比

为什么三种方法的循环条件不同

  • i和j都有效时,需要j>i退出循环,即已经没有任何有效的值,i=j时还有一个有效值
  • i有效,j无效时,需要j>=i退出循环
  • i有效,j无效但平衡版,需要留存一个有效值用于退出循环后和target比较,所以j-i>1,留出a[i]这个有效值

你可能感兴趣的:(算法,java,开发语言)