发布时间:2025-01-04 13:01
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态
算法也是我们python中不可缺少的一部分,今天我们就来学习一下python中的二分查找算法
在我们平时,如果我想要在一个列表中查找一个元素,我们有哪些方法?我们可以一个一个元素的进行对比查找,若有100个元素,我们得花费100个单位的时间,这样就比较浪费时间,就像我们在电话簿中查找某个人的电话,我们就得一页一页的查找,费时费力,那有没有比较省力的办法呢?二分查找就是一个不错的选择
二分查找是一种算法,其输入是一个有序的元素列表(必须是有序的),如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null函数 binary_search 接受一个有序数组和元素.如果指定的元素在这个数组中,则返回其位置
就像我们平时玩的游戏:
猜一个1 ~ 100之内的数字,我们有两种方法:
1.从1开始,然后2,3,4,5…知道我们要猜的那个数字,若这个数字是1的话还好说,我们一次就成功了,但若是这个数字是100呢,我们就得猜100次
2.我们先猜一个中间数(50),在来判断这个数字是比50大还是小,若比50大,那下一次就在51 ~ 100之内猜,若比50小,下一次就在1 ~ 49之内猜,这样我们猜的范围就会越来越小,直到猜对为止,这种方法我们最多也就只用猜7次就会得到正确答案,这就是二分查找
def binary_search(list, item): # 其输入的是一个列表和查找的元素
a = 0 # 数字在0~列表的长度之间
b = len(list) - 1
while a <= b: # 判断列表之中是否存在数字
find_num = (a + b) # 找到列表中间的那个数字
num = list[find_num]
if num == item: # 判断查找的元素是否就是列表中间的数字
return find_num # 若是则返回中间的那个数字
elif num > item: # 若中间的那个数字大于查找的数字
b = find_num - 1 # 则将查找范围的尾减半
else: # 若中间的那个数字小于查找的数字
a = find_num + 1 # 则将查找范围的首减半
return None
my_list = [1, 3, 5, 7, 9]
print(binary_search(my_list, 5)) # 结果为2
print(binary_search(my_list, -5)) # 结果为None