有序列表對於我們的比較是很有用的。在順序查找中,當我們與第一個項進行比較時,如果第一個項不是我們要查找的,則最多還有 n-1 個項目。 二分查找從中間項開始,而不是按順序查找列表。 如果該項是我們正在尋找的項,我們就完成了查找。 如果它不是,我們可以使用列表的有序性質來消除剩餘項的一半。如果我們正在查找的項大於中間項,就可以消除中間項以及比中間項小的一半元素。如果該項在列表中,肯定在大的那半部分。然後我們可以用大的半部分重複這個過程。從中間項開始,將其與我們正在尋找的內容進行比較。再次,我們找到元素或將列表分成兩半,消除可能的搜索空間的另一部分。下圖展示了該算法如何快速找到值 54 。完整的函數見CodeLens 3中。
、
建立一個binarySearch.py文件
# 二分法查找 def binarySearch(alist, item): first = 0 last = len(alist)-1 found = False while first <= last and not found: midpoint = int((first + last) / 2) if alist[midpoint] == item: found = True else: if item < alist[midpoint]: last = midpoint - 1 else: first = midpoint + 1 return found testlist = [0, 1, 2, 8, 13, 17, 32, 42] print(binarySearch(testlist,3)) print(binarySearch(testlist,13))
遞歸調用二分查找函數
# 遞歸調用二分查找 def binarySearch(alist, item): if len(alist) == 0: return False else: midpoint = (len(alist) - 1) // 2 if alist[midpoint] == item: return True else: if item < alist[midpoint]: return binarySearch(alist[:midpoint], item) else: return binarySearch(alist[midpoint + 1:], item) testlist = [0, 1, 2, 8, 13, 17, 19, 32, 54] print(binarySearch(testlist, 3)) print(binarySearch(testlist, 13))