对二分算法的理解
二分算法是一种事半功倍的搜索算法,能运用二分的前提是数组要排好序。二分算法的整体思路如下:
数组搜索某数x的思路
已知某数组a:1、2、3、4、5、6、7、8、9、10、11、12、13:
- 首先定位L和R :L=0,首次定位在数组首位;R=len(a)-1,首次定位在数组尾部;
- 首先定位mid:mid=(L+R+1)/2;
- while(L<R) 执行循环,反复改变L、R、mid的值:如果x<a[mid],R=mid-1,否则L=mid+1。执行mid=(L+R+1)/2;
- 循环结束后,输出L或者R的值:如果与x不相等,则a数组中没有x;否则相等;
二分算法的难点
二分算法的难点在于如何对取到的边界值进行处理以及如何判断先抛弃左半部分还是先抛弃右半部分:当题目告诉你从右半部分着手解题时,先移动R(右半边界) ,反之亦然:
- 如果搜索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
- 如果搜索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; 这里取左边
}