在单调递增序列a中查询x的后继

while(l<r){
    int mid=(l+r)>>1;
    if(a[mid]>=x)
        r=mid;
    else l=mid+1;
}
return a[l];

 


在单调递增序列a中查询x的前驱

while(l<r){
    int mid=(l+r+1)>>1;
    if(a[mid]<=x) 
        l=mid;
    else r=mid-1;
}
return a[l];


若是单调递减序列 那么将if和else后面的语句交换一下位置就好了

注意,对于两种不同的目的,与之对应的mid是不同的,不然有可能会造成边界错误,然后就是死循环,这也是二分容易写挂的原因。

posted on 2019-10-12 07:56  萌德真帅  阅读(248)  评论(0编辑  收藏  举报