python实现二分查找(无bug)

二分查找的优点:比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难

学习之前,在网上找了一些教程,测试过程中,总会有兼顾不到的地方,所以在此总结了一下,解决了大部分的漏洞。

如果还有什么问题,欢迎各位指正,代码如下

def sort_list(my_list):
    # 首先将列表排序,这里用的是冒泡
    for j in range(len(list_data)):
        for i in range(len(list_data) - j - 1):
            if list_data[i] > list_data[i + 1]:
                list_data[i], list_data[i + 1] = list_data[i + 1], list_data[i]
    return list_data

递归方式

def binary_search1(my_list, num):
    # 递归
    middle_index = len(my_list) // 2  # 算出中间索引
    if middle_index == 1:  # 如果剩下列表两个元素, 就不必递归了,直接判断
        if num == my_list[0] or num == my_list[1]:
            return True
        else:
            return False
    if middle_index == 0:  # 如果列表只有一个元素
        if num == my_list[middle_index]:
            return True
        else:
            return False
        
    # 如果这个数字大于中间索引的数字, 使用切片递归查询
    if num > my_list[middle_index]:
        return binary_search1(my_list[middle_index:], num)
    # 如果这个数字小于中间索引的数字, 使用切片递归查询
    elif num < my_list[middle_index]:
        return binary_search1(my_list[:middle_index + 1], num)
    # 如果这个数字等于中间索引的数字,返回True
    elif num == my_list[middle_index]:
        return True

非递归方式

def binary_search2(my_list, num):
    # 非递归
    start = 0  # 开始位置索引
    end = len(my_list) - 1  # 结束位置索引

    while start <= end:
        # 这个判断是为了防止找不到元素而无限循环
        if end - start == 1:
            if num == my_list[start] or num == my_list[end]:
                return True
            else:
                return False

        middle_index = (start + end) // 2
        if num == my_list[middle_index]:
            return True
        elif num > my_list[middle_index]:
            start = middle_index
        else:
            end = middle_index
    return False
if __name__ == '__main__':
    list_data = [2, 5, 1, 6, 4, 4, 8, 7]
    my_list = sort_list(list_data)
    print(binary_search1(my_list, 1))
    print(binary_search2(my_list, 9))

打印结果如下

True
False
发布了5 篇原创文章 · 获赞 1 · 访问量 2682

猜你喜欢

转载自blog.csdn.net/weixin_44462377/article/details/90582559