二分查找,折半查找,在一个排好序的列表,列表元素lst[0:n],时间复杂度:O(logn)
思想:
1.确定初始下界上界(索引-index),下界0,上界列表长度减1
2.判断条件控制while循环,下界小于上界,中间值整除2向下取整,如不满足循环,说明列表无此元素
3.情况1,fast way,中间值索引对应的列表值等于要查找的数值,返回index
4.情况2,如果目标值在mid左侧,即上界应该从新确定,在mid左侧减1,赋值后进入下轮循环
5.情况3,如果目标值在mid的右侧,即下界应该从新确定,在mid右侧加1,赋值后进入下轮循环
代码:
import random
def binary_search(lst, val):
left = 0
right = len(lst)-1
while left <= right: # 候选区有值
mid = (left + right) // 2 # 向下取整
if lst[mid] == val:
return mid
elif lst[mid] > val: # 目标值在mid左侧
right = mid - 1
else: # lst(mid) < val, 目标值在mid右侧
left = mid + 1
else:
return None
if __name__ == "__main__":
lst = [random.randint(0,50) for x in range(10)]
lst.sort()
val = random.choice(lst)
print(binary_search(lst, val))