二分查找
二分查找的思想想必大家都很熟悉了,但是把二分查找的思想落实到代码层面还是有一点小困难的。这也就是为什么二分的思想提出很多年后才有了第一个没有bug的二分查找代码。
二分查找需要注意一点就是一定要在有序的数列中。
二分查找代码的实现难点在于边界情况的处理。
template<typename T>
int binarySearch(T arr[],int n,T target){
int l=0,r=n-1; //在[l...r]的范围内寻找target
while(l<=r){ //在l==r时,区间仍然有效
int mid = l+r>>1;
if(arr[mid]==target)
return mid;
if(target>arr[mid])
l=mid+1; //target在[mid+1,...r]中
else
r=mid-1; //target在[l,...mid-1]中
}
return -1;
}
二分模板
-
当区间[l,r]划分成[l,mid]和[mid+1,r]时,更新操作是r=mid或者l=mid+1,计算mid时不需要加1.
int bsearch_1(int l,int r){ while(l<r){ int mid=l+r>>1; //下取整 if(check(mid)) r=mid; else l=mid+1; } return 1; }
-
当区间[l,r]划分成[l,mid-1]和[mid,r]时,更新操作是r=mid-1或者l=mid,计算mid时需要加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; } return 1; }