二分查找有几种写法?它们的区别是什么? - Jason Li的回答 - 知乎
https://www.zhihu.com/question/36132386/answer/530313852
上中位数:两个中位数中较大的那个。下中位数则是较小的那个。
把二分搜索的实现分解为上界查找和下界查找两个函数
def lower_bound(array, first, last, value): # 返回[first, last)内第一个不小于value的值的位置
while first < last: # 搜索区间[first, last)不为空
mid = first + (last - first) // 2 # 防溢出
if array[mid] < value: first = mid + 1
else: last = mid
return first # last也行,因为[first, last)为空的时候它们重合
def upper_bound(array, first, last, value): # 返回[first, last)内第一个大于value的位置
while first < last:
mid = first + (last - first)//2
if array[mid] <= value: first = mid + 1
else: last = mid
return first
注意转换关系:
求x>=value的最小位置:lower_bound(first, last, value)
求x>value的最小位置:upper_bound(first, last, value)
求x<=value的最大位置:upper_bound(first, last, value) - 1