如何写对二分查找的代码而不出错

二分查找有几种写法?它们的区别是什么? - 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

posted on 2019-06-30 21:28  Frank_Allen  阅读(274)  评论(0编辑  收藏  举报

导航