二分查找就是每次都取中间值,来对要查找的值进行对比,不断缩小范围的过程。

例如:

我们利用一个猜数字的小游戏来举例,我们心里想一个范围是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))

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐