内容来算法竞赛进阶指南,我把自认为的重点写了下来,方便查看
while(l<r)
{
int mid=(l+r)>>1;
if(a[mid]>=x)
r=mid;
else
l=mid+1;
}
cout<<l<<endl;
while(l<r)
{
int mid=(l+r+1)>>1;
if(a[mid]<=x)
l=mid;
else
r=mid-1;
}
cout<<l<<endl;
r,l的取值简单的数学知识就能看懂。
关键是俩个写法的的mid的取值,如果对第二段代码也是(l+r)>>1,那么当r-l等于1时候,就有mid=(l+r)>>1=l。
若是进入l=mid,则死循环,若进入r=mid-1,则l>r,循环不能以l>r结束。(能用<<1别/2,因为右移是向下取整而除法是向零取整。可能会发生意想不到的错误)
步骤:
1.分析问题,左右区间那个是可行区间,以及mid归属哪一半段。
2.根据分析结果选择代码1或者代码2。
3.二分的中止条件即l==r,该值就是答案所在的位置。
原文:https://www.cnblogs.com/Aracne/p/12812269.html