❖在顺序查找中,如果第1个数据项不匹配查找项的话,那最多还有n-1个待比对的数据项
❖那么,有没有方法能利用有序表的特性,迅速缩小待比对数据项的范围呢?
❖我们从列表中间开始比对!
如果列表中间的项匹配查找项,则查找结束如果不匹配,那么就有两种情况:
• 列表中间项比查找项大,那么查找项只可能出现在前半部分
• 列表中间项比查找项小,那么查找项只可能出现在后半部分
无论如何,我们都会将比对范围缩小到原来的一半:n/2
❖继续采用上面的方法查找
每次都会将比对范围缩小一半
def binarySearch(alist, item):
first = 0
last = len(alist) - 1
found = False
while first <= last and not found:
midpoint = (first + last) // 2
if alist[midpoint] == item:
found = True
else:
if item < alist[midpoint]:
last = midpoint
else:
first = midpoint
return found
testList = [1,4,2,65,6,3,5,77,34]
print(binarySearch(testList,2))
print(binarySearch(testList,666))
❖二分查找算法实际上体现了解决问题的典
型策略:分而治之
将问题分为若干更小规模的部分通过解决每一个小规模部分问题,并将结果汇总得到原问题的解
❖显然,递归算法就是一种典型的分治策略算法,二分法也适合用递归算法来实现
def binarySearch(alist, item):
if len(alist) == 0:
return False
else:
midpoint = len(alist)//2
if alist[midpoint] == item:
return True
else:
if item < alist[midpoint]:
return binarySearch(alist[:midpoint],item)
else:
return binarySearch(alinst[midpoint:],item)
testList = [1,4,2,65,6,3,5,77,34]
print(binarySearch(testList,2))
print(binarySearch(testList,666))