二分查找的正确性与不变式有关,只要初始化,保持,终止这三个条件满足,算法就正确。
二分查找有很多变种,这里讨论的二分查找满足如下条件:
1、如果待查找的值在数组中并且可能不止一个,返回最小的下标。
2、如果待查找的值在数组中并且可能不止一个,返回最小的下标;
3、如果待查找的值不在数组中,返回最接近的比它大的下标。
int binarysearch(int l,int r,int k)
{
if (k > a[r]) return r+1;
int mid;
while (l < r)
{
mid = l + (r - l) / 2;
if (a[mid] >= k)
r = mid;
else
l = mid + 1;
}
return l;
}
这里的l,r是闭区间。
循环不变式满足
1、a[l] <= k <= a[r],且a[l-1] < a[l],如果k在数组中
2、k < a[r],且当l!=r时有a[l]<k,如果k不在数组中