二分查找变体

258 阅读1分钟

变体一:查找第一个值等于给定值的元素

public int bsearch(int[]a,int n,int value){
  int low = 0;
  int high = n-1;
  while(low<=high){
    //注意括号
  int mid = low+((high-low)>>1);
  if(a[mid]>value){
    high = mid-1;
  }else if(a[mid]<value){
    low = mid+1;
  }else{
    if(mid==0||a[mid-1]!=value){
      return mid;
    }else{
      //因为是查找第一个值
      high = mid-1;
    }
  }
  }
  return -1;
}

变体二:查找最后一个值等于给定值的元素

public int bsearch(int[]a,int n,int value){
  int low = 0;
  int high = n-1;
  while(low<=high){
  int mid = low+((high-low)>>1);
  if(a[mid]>value){
    high = mid-1;
  }else if(a[mid]<value){
    low = mid+1;
  }else{
    if(mid==n-1||a[mid+1]!=value){
      return mid;
    }else{
      //因为要查最后一个值
      low = mid+1;
    }
  }
  }
  return -1;
}

变体三:查找第一个大于等于给定值的元素

public int bsearch(int[]a,int n,int value){
  int low = 0;
  int high = n-1;
  while(low<=high){
      int mid = low+((high-low)>>1);
    if(a[mid]>=value){
      if((mid==0)||a[mid-1]<value){
        return mid;
      }else{
        high = mid-1;
      }
    }else{
      low = mid+1;
    }
  }
  return -1;
}

变体四:查找最后一个小于等于给定值的元素

public int bsearch(int[] a,int n,int value){
  int low = 0;
  int high = n-1;
  while(low<=high){
    int mid = low+(high-low)>>1;
    if(a[mid]>value){
      high = mid-1;
    }else{
      if(mid==n-1||a[mid+1]>value){
        return mid;
      }else{
        low = mid+1;
      }
    }
  }
  return -1;
}