python算法----二分查找算法

算法(Algorithm)

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态
算法也是我们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

你可能感兴趣的:(笔记,算法,python)