binary_search

lower_bound的实现


int lower_bound(int *arr, int len, int key){
  //-1是取不到的值,而len则可以取到(此时key大于数组中所有的值)
  int lb = -1, ub = len;

  while(ub - lb > 1){
    int mid = (ub + lb) /2;

    if(arr[mid] < key){
      lb = mid;
    }else{
      ub = mid;
    }
  }

  return ub;
}

上面为什么要用上界了,因为在二分过程中,改变下界的条件是arr[mid] < key,此时说明key在右半部分,常规的做法是将下界变为(mid 或者 mid + 1),而这两个值不一定有效

求得是arr[i] >= key的最 注意得到的是排序好的数组中大于或等于key的数的下标

当arr[mid] < key时,一定取不到mid,所以lb = mid,lb在变化的过程中始终取不到

当arr[mid] > key时,有可能取到mid,

同样,当arr[mid] == key时,有可能取到mid(数组中有重复的元素,多个key)

另外的二分写法

int lb = value1,ub = value2;连个均是可以取到的值

while(lb < ub){
  int mid = (ub + lb) >>1;

  if()
    lb = mid + 1;    //此处一定要是mid+1,否则会导致死循环(当只有两个元素进行二分的时候,mid刚好在第一个元素)
   else
     ub = mid;
}

results matching ""

    No results matching ""