二分查找必须保证是"有序的"一个列表或元组,因为列表和元祖都是有下标的.
思想: 掐头结尾取中间,每一次都和中间的那个数进行比较,如果比中间的数大,往左移,比中间的数小,往右移.
递归二分查找
# lst = [1,2,2,3,4,5,6,7,8,14,21,23,25,41,58,66,225,574]
#
# left = 0 # 最左边的索引位置
# right = len(lst) - 1 # 最右边的索引位置
#
# def lookup(left,right,n): # 传入最左索引,最右,还有要找的值
# middle = (left + right) // 2 # 找到中间的位置,前面加后面除2,就是中间,索引都是是整数,所以用地板除
# print(f'中间位置{middle}') # 打印每一次使用的中间位置
# if right < left: # 如果最右边小于最右边,就证明,两端已经相遇了,不能再接着找了,再找索引就会超出范围
# print('没找到')
# return -1 # 返回"-1"表示没事找到
# elif n > lst[middle]: # 如果要找的数大于中间的数,证明要找的数在中间的右边
# left = middle + 1
# lookup(left, right, n)
# elif n < lst[middle]: # 如果要找的数小于中间的数,证明要找的数在中间的左边
# right = middle - 1
# lookup(left, right, n)
# else:
# print(f'索引为{middle}')
#
# lookup(left,right,574)
纯算法二分查找
lst = [1,2,3,4,5,6,7,8,14,21,23,25,41,58,66,225,574]
left = 0 # 头
right = len(lst) - 1 # 尾
n = 66
while left <= right:
middle = (left + right) // 2
if n > lst[middle]:
left = middle + 1
print(left)
elif n < lst[middle]:
right = middle - 1
print(right)
else:
print(f'找到了{middle}')
break
else:
print("没找到")