二分查找必须保证是"有序的"一个列表或元组,因为列表和元祖都是有下标的.
思想: 掐头结尾取中间,每一次都和中间的那个数进行比较,如果比中间的数大,往左移,比中间的数小,往右移.
递归二分查找
# 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("没找到")