1. 程式人生 > >二分查詢演算法及其變式(Python)

二分查詢演算法及其變式(Python)

二分查詢演算法是一種非常常用而且筆試很容易考到的演算法,但是演算法導論這本書上居然沒有講到,在這裡寫一篇blog做個記錄

1.經典二分查詢,從列表中找到一個數的索引

def search(a, p, r, key):
    if p > r:
        return False
    q = (p + r) // 2
    if a[q] == key:
        return q
    elif a[q] > key:
        return search(a, p, q - 1, key)
    else:
        return search(a, q + 1, r, key)

def main():
    a = list(range(0, 100))
    print(a)
    print(search(a, 0, len(a) - 1, -1))

if __name__ == '__main__':
    main()

2.二分查詢變式,翻轉陣列中找到最小值

def search(a, p, r):
    if not a:
        return False
    mid = (p + r) // 2
    if p + 1 == r:
        if a[p] > a[r]:
            return r
        else:
            return p

    if a[mid] < a[p]:
        return search(a, p, mid)
    else:
        return search(a, mid, r)

def main():
    a = list(range(100))
    for i in range(-100, 0):
        a.append(i)
    x = search(a, 0, len(a) - 1)
    print(x, a[x])

if '__main__' == __name__:
    main()

3.其他變式

翻轉陣列相關的都可以找到最小值以後轉化為經典演算法