二分法查询是比较有序数列的中间值与指定查询数的大小来找到查询数下标值的,大大缩短查询速度
二分法对序列的要求,必须是从小到大的有序数列,下面是两种方法,一个是普通方法,另外一个是递归方法
普通方法:
lst = [21, 22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 213, 214, 215, 216]
n = 215
# 次数
count = 0
# 起始位置
start_len = 0
# 初始位置
end_len = len(lst) - 1
while end_len >= start_len:
# 中间位置
middle = (start_len + end_len) // 2
count += 1
if n < lst[middle]:
end_len = middle - 1
elif n > lst[middle]:
start_len = middle + 1
else:
print("找到这个数{},在{}号位置,{}次找到".format(n, middle + 1, count))
break
else:
print("没这个数")
递归方法:
lst = [21, 22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 213, 214, 215, 216]
def binaryChop(lst, start_len, end_len, n, count):
if end_len < start_len:
print("不存在")
return
middle = (start_len + end_len) // 2
count += 1
if n < lst[middle]:
end_len = middle - 1
elif n > lst[middle]:
start_len = middle + 1
else:
print("找到这个数{},在{}号位置,{}次找到".format(n, middle + 1, count))
return
return binaryChop(lst, start_len, end_len, n, count)
binaryChop(lst, 0, len(lst) - 1, 216, 0)