二分查找算法是一种非常常用而且笔试很容易考到的算法,但是算法导论这本书上居然没有讲到,在这里写一篇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.其他变式
翻转数组相关的都可以找到最小值以后转化为经典算法