二分查找
有序列表对于我们的比较是很有用的。在顺序查找中,当我们与第一个项进行比较时,如果第一个项不是我们要查找的,则最多还有 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))