Python算法之二分查找
基础的查找算法,二分查找。
·
二分查找就是每次都取中间值,来对要查找的值进行对比,不断缩小范围的过程。
例如:
我们利用一个猜数字的小游戏来举例,我们心里想一个范围是0~6的整数2,接下来把0~6的数组罗列【0,1,2,3,4,5,6】,二分查找取中间值,最大的是6,最小的是0,那么中间值就是(最小 + 最大)/ 2,就是3,发现大于,那么比3大的数包括3都排除了,那么就可以把最大值缩小成3 - 1,就变成了这样的一个数组【0, 1, 2】。再取中间值1,发现小于,那么1,0排除,数组只有【2】,那么就是2了。这就是相比一个一个找的顺序查找效率高些的二分查找算法了。二分查找只能用于从小到大排列的数组或者是从大到小的,也就是有顺序的数列哦。
接下来我们用一个查找电话号码对应位置的实例来理解一下。
首先我们创建一个列表,电话号码是一个11位的整数,所以我们将其顺序排列。
每一个电话号码对应了一个数字
排列完成后就是这样的:num_list = [13601950623, 13621714000, 15201753079, 17521295718, 19921771195]
num_list[0]也就是第一个电话号码对应数字1,以此类推。
利用二分查找输入电话号码来取得对应的数字,接下来请看代码:
num_list = [17521295718, 15201753079, 13601950623, 13621714000, 19921771195]
numbers = int(input('输入电话号码:'))
# 冒泡排序函数,二分查找只能用于有顺序的数列
def bubble_sort():
for j in range(len(num_list) - 1):
for i in range(len(num_list) - 1 - j):
if num_list[i] > num_list[i + 1]:
num_list[i], num_list[i + 1] = num_list[i+1], num_list[i]
print(num_list)
# 二分查找函数
def find(key):
# 首先取列表的中间一项,与要查找的数对比
# 初始化最大和最小的范围,由于列表第一项为0,所以最大的一项是总数 - 1
minimum = 0
maximum = len(num_list) - 1
# 对比中间一项大于小于或等于要查找的数字
while True:
# 中间值就是最小的范围加上最大的范围除以2,//代表整除,例如1.5就取1,2.4就取2
mid = (minimum + maximum) // 2
# 如果大于,那么比这个中间值大的数就排除了,所以将最大的范围值设置成中间值减去1
if num_list[mid] > key:
maximum = mid - 1
# 反之,小于就把最小的范围值设置成中间值加一
elif num_list[mid] < key:
minimum = mid + 1
# 如果等于就把中间值设置成函数的反回值,加上一代表代号是4
elif num_list[mid] == key:
return mid + 1
bubble_sort()
print(find(numbers))
更多推荐
已为社区贡献3条内容
所有评论(0)