1.二分查找
(1)将待查找区间分成两半,如果要找的元素正好在中间,则查找过程结束;如果要找的元素比中间元素大,则在较大的半边继续查找;反之,在较小的半边查找。重复这个过程,直到找到目标元素或者区间大小缩减为零,表示元素不存在。
(2)python代码演示
def binary_search(alist, val):
n = len(alist)
if n == 0:
return False
mid = n // 2
if alist[mid] == val:
return True
elif alist[mid] < val:
return binary_search(alist[mid+1:], val)
elif alist[mid] > val:
return binary_search(alist[:mid], val)
if __name__ == '__main__':
alist = [1, 3, 5, 7, 9]
val = 7
print(binary_search(alist, val))
若使其输出为val对应列表中元素的索引值,此时不可以使用切片。因为使用切片会创建一个新的列表,可采用如下方法。
def binary_search(alist, val, start, end):
if start >= end:
return False
mid = (start + end) // 2
if alist[mid] == val:
return mid
elif alist[mid] < val:
return binary_search(alist, val, mid+1, end)
elif alist[mid] > val:
return binary_search(alist, val, start, mid-1)
if __name__ == '__main__':
alist = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
print(binary_search(alist, 0, 0, len(alist) - 1))
print(binary_search(alist, 90, 0, len(alist) - 1))