2020 寒假私讯——二分算法

对二分算法的理解

二分算法是一种事半功倍的搜索算法,能运用二分的前提是数组要排好序。二分算法的整体思路如下:

数组搜索某数x的思路

已知某数组a:1、2、3、4、5、6、7、8、9、10、11、12、13:

  1. 首先定位L和R :L=0,首次定位在数组首位;R=len(a)-1,首次定位在数组尾部;
  2. 首先定位mid:mid=(L+R+1)/2;
  3. while(L<R) 执行循环,反复改变L、R、mid的值:如果x<a[mid],R=mid-1,否则L=mid+1。执行mid=(L+R+1)/2;
  4. 循环结束后,输出L或者R的值:如果与x不相等,则a数组中没有x;否则相等;
二分算法的难点

二分算法的难点在于如何对取到的边界值进行处理以及如何判断先抛弃左半部分还是先抛弃右半部分:当题目告诉你从右半部分着手解题时,先移动R(右半边界) ,反之亦然:

  1. 如果搜索a,令x<=a,a属于数组中最小的那一个:(先操作右部)
while(l<=r)
{
   
int mid=(l+r)>>1;   //mid取中;
if(a[mid]>=x) r=mid; //对L、R进行移动的模板 ,这里取左边
else l=mid+1;//这里取右边
}
return a[l];  //或者L
  1. 如果搜索a,令x>=a,a属于最大的那一个:(先操作左部)
  while(l<r)
{
   
int mid=(l+r+1)>>1; //取中,因为左移1的操作是去尾,所以“L+R+1”,让mid尽量兼顾中间靠右的数
if(a[mid]<=x) l=mid;  //这里取右边
else r=mid-1;    这里取左边
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值