循环二分查找

list = [1,2,4,5,7,8,10,11,13,15,17,18,19,20]
n = 2
start = 0
stop = len(list) - 1

while start<=stop:
mid = (start+stop)//2
# 小于中间数
if n==list[mid]:
print(mid)
break
elif n<list[mid]:
stop=mid-1
else:
start=mid+1

这里当时我有个疑问,为啥stop=len(list)-1

因为实际的长度,与下标差1,下标是从0开始的。

如list=[1,2,3]

list[1]=2

递归二分查找

def binary_search_recursion(list, val, start, end):
if start > end:
return None
mid = (start + end) // 2

if list[mid] < val:
return binary_search_recursion(list, val, mid + 1, end)
if list[mid] > val:
return binary_search_recursion(list, val, start, mid - 1)
return mid


list = [1, 2, 3, 4, 6, 8, 9, 11, 12]
val = 11
start = 0
end = 8
print(binary_search_recursion(list, val, start, end))