二分查找作为程序员的一项基本技能,是面试官最常使用来考察程序员基本素质的算法之一,也是解决很多查找类题目的常用方法,它可以达到 的时间复杂度。
前提条件
必须有序。一般是从小到大有序。
坑点
计算中间值导致的数据越界。一般我们都是定义左边界(left)和右边界(right)都使用 int 类型,如果 left 和 right 足够大,mid = (left + right)/2,可能会由于 left+right 导致 int 数据类型越界。所以安全的写法是 mid = left + ((right - left) >> 1) 或者 mid = left + (right - left) / 2,推荐使用右移操作,因为右移比除法快。
模板代码
实现类似 STL 的 lower_bound() 函数功能。
C++模板代码
int lower_bound(int *A, int l, int r, int val) { // [l, r)
while (l<=r) {
int mid = l + ((r-l)>>1);
if(A[mid]>=val) {
r = mid-1;
} else {
l = mid+1;
}
}
return l;
}