原理
二分法查找的原理非常直觀和易于理解:
假設(shè)有一個已經(jīng)排序好的列表,在其中查找某個元素,如果查找到,就返回該元素的索引index值,如果沒有查找到,則返回None.
這個算法有兩個版本,遞歸和非遞歸,遞歸的版本比較容易理解。
要點
需要注意的是,在判斷是否對整個列表遍歷完的時候,需要判斷現(xiàn)在搜索的列表首尾元素索引值是否有效,如果首元素索引值已經(jīng)超過尾元素的索引值,則整個遍歷已經(jīng)結(jié)束,只是沒有找到,應該直接返回None.
Python代碼實現(xiàn)
下面的代碼在Python 3上測試通過
遞歸版本:
def bin_search_recursively(l, first, last, n):
'''Binary search n in list l which has been sorted already, returns
the index if found, else returns None.'''
if first > last:
return None
mid = (first + last) // 2 # Use / 2 if you're using Python 2
if l[mid] > n:
return bin_search_recursively(l, first, mid - 1, n)
elif l[mid] < n:
return bin_search_recursively(l, mid + 1, last, n)
else:
return mid
if __name__ == '__main__':
sorted_num_list = list(range(1, 11))
first = 0
last = len(sorted_num_list) - 1
n1 = 12
n2 = 6
print(bin_search_recursively(sorted_num_list, first, last, n1))
print(bin_search_recursively(sorted_num_list, first, last, n2))
代碼輸出:
None
5
非遞歸版本:
def bin_search_nonrecursively(l, first, last, n):
'''Binary search n in list l which has been sorted already, returns
the index if found, else returns None.'''
while first <= last:
mid = (first + last) // 2 # Use / 2 if you're using Python 2
if l[mid] > n:
last = mid - 1
elif l[mid] < n:
first = mid + 1
else:
return mid
return None
if __name__ == '__main__':
sorted_num_list = list(range(1, 11))
first = 0
last = len(sorted_num_list) - 1
n1 = 12
n2 = 6
print(bin_search_nonrecursively(sorted_num_list, first, last, n1))
print(bin_search_nonrecursively(sorted_num_list, first, last, n2))
代碼輸出:
None
5