二分查找

二分查找必须保证是"有序的"一个列表或元组,因为列表和元祖都是有下标的.
思想: 掐头结尾取中间,每一次都和中间的那个数进行比较,如果比中间的数大,往左移,比中间的数小,往右移.

递归二分查找

# 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("没找到")

  

posted @ 2018-03-24 08:17  王剑威  阅读(153)  评论(0编辑  收藏  举报