二分查詢演算法及其變式(Python)
阿新 • • 發佈:2018-12-13
二分查詢演算法是一種非常常用而且筆試很容易考到的演算法,但是演算法導論這本書上居然沒有講到,在這裡寫一篇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.其他變式
翻轉陣列相關的都可以找到最小值以後轉化為經典演算法