//查找任意一个i,使得arr[i]等于v,不存在返回-1
int bsearch_any_i(int arr[],int l,int r,int v){
int left=l,right=r;
while(left<=right){
int mid=left+(right-left)/2;
if(arr[mid]<v)
left=mid+1;
else if(arr[mid]>v)
right=mid-1;
else
return mid;
}
return -1;
}
//查找最小的i使得arr[i]等于v,不存在返回-1,没有出现死循环
int bsearch_min_i(int arr[],int l,int r,int v){
int left=l,right=r;
while(left<right){
int mid=left+(right-left)/2;
if(arr[mid]>=v)
right=mid;
else
left=mid+1;
}
if(arr[right]==v) return left;
else return -1;
}
//查找最大的i使得arr[i]等于v,不存在返回-1,可能出现死循环
int bsearch_max_i(int arr[],int l,int r,int v){
int left=l,right=r;
while(left<right-1){
int mid=left+(right-left)/2;
if(arr[mid]<=v)
left=mid;
else
right=mid-1;
}
if(arr[right]==v) return right;
else if(arr[left]==v) return left;
else return -1;
}
//这个地方我的right没有减1,感觉不需要,没有出现死循环
//查找最小的i使得arr[i]大于v,不存在则返回-1
int bsearch_min_greater_i(int arr[],int l,int r,int v){
int left=l,right=r;
while(left<right){
int mid=left+(right-left)/2;
if(arr[mid]>v)
right=mid;
else
left=mid+1;
}
if(arr[right]>v) return right;
else return -1;
}
//查找最大的i使得arr[i]小于v,不存在则返回-1,可能会出现死循环
int bsearch_max_greater_i(int arr[],int l,int r,int v){
int left=l,right=r;
while(left<right-1){
int mid=left+(right-left)/2;
if(arr[mid]<v)
left=mid;
else
right=mid-1;
}
if(arr[right]<v) return right;
else if(arr[left]<v) return left;
else return -1;
}
总之:剩余两个元素的时候,找最大的时候可能会出现死循环,找最小的不会。