int bsearch_1(int l,int r){
while(l<r){
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;}
retrun 1;
int bsearch_2(int l,int r){
while(l<r)
int mid=l+r+1>>1;
if(check(mid))l=mid;
else r=mid-1;
以上为两种代码形式。
假定有序序列:1 2 3 4 5 6 7 ;
若以某数为分界点,左边为蓝区,右边为红区。
如mid落在蓝区,分界点则在蓝区后,故直接将l更新为mid继续往后查找。
若mid落在红区,分界点则在红区前,故直接将r更新为mid-1往前查找。
此处mid=l+r+1是为了防止l=r-1时陷入死循环。
两种代码的形式不同在于check(mid)的不同,若赋l=mid就加1,防止死循环、