二分查找——递归以及非递归方法【Python】超简单详细

 1、概述

        也叫折半查找,是一种在有序数组中查找特定元素的搜索算法

2、前提

        查找的序列必须有序

3、时间复杂度

        最差 O( nlogn ),最优 O( 1 )

4、查找步骤

        1. 找到数组的中间元素

        2. 如果中间元素正好是要查找的元素,则搜索过程结束

        3. 如果要查找的元素大于中间元素,则在数组的右半部分进行搜索

        4. 如果要查找的元素小于中间元素,则在数组的左半部分进行搜索

        5. 重复以上步骤,直到找到要查找的元素,或者搜索区间为空

5、代码实现

递归方法:

# 1. 定义 二分查找 函数
def binary_search(my_list, item):
    """
    实现 二分查找
    :param my_list: 要查找的 列表,!必须:有序
    :param item: 要查找的 元素
    :return: 查找结果,找到 True,未找到 False
    """
    # 1.1 获取 列表长度
    n = len(my_list)
    # 1.2 若长度 <= 0,直接返回 False
    if n <= 0:
        return False
    # 1.3 获取 中间值 的索引
    mid = n // 2
    # 1.4 开始比较, 如果一样就返回True
    if item == my_list[mid]:
        return True
    # 1.5 如果要查找的值 < 中间值, 就去: 中间值的左边找
    elif item < my_list[mid]:
        return binary_search(my_list[:mid], item)
    # 1.6 如果要查找的值 > 中间值, 就去: 中间值的右边找
    else:
        return binary_search(my_list[mid+1:], item)


# 2. 定义main函数, 测试
if __name__ == '__main__':
    # 2.1 定义列表, 记录: 要查找的元素
    my_list = [11, 35, 44, 63, 77, 92]
    # 2.2 调用函数, 二分查找. 获取结果
    result = binary_search(my_list, 66)
    # 2.3 打印结果.
    print(f'查找结果为: {result}')

非递归方法: 

# 1. 定义 二分查找 函数
def binary_search(my_list, item):
    """
    实现 二分查找
    :param my_list: 要查找的 列表,!必须:有序
    :param item: 要查找的 元素
    :return: 查找结果,找到 True,未找到 False
    """

    # 1.1 查找区间, 开始索引 和 结束索引
    start = 0
    end = len(my_list) - 1

    # 1.2 开始循环查找
    while start <= end:
        # 1.3 计算中间索引, 要写到循环中, 每次循环都需要重新计算中间索引
        mid = (start + end) // 2

        # 1.4 具体的比较逻辑
        if item == my_list[mid]:
            return True
        elif item < my_list[mid]:
            end = mid - 1       # 如果目标值小于中间值, 就去左侧查找
        else:
            start = mid + 1     # 如果目标值大于中间值, 就去右侧查找

    # 1.5 走这里, 说明没找到, 返回结果即可
    return False

# 2. 定义main函数, 测试
if __name__ == '__main__':
    # 2.1 定义列表, 记录: 要查找的元素
    my_list = [11, 35, 44, 63, 77, 92]
    # 2.2 调用函数, 二分查找. 获取结果
    result = binary_search(my_list, 55)
    # 2.3 打印结果
    print(f'查找结果为:{result}')
6、应用场景

        1. 电话号码查找

        在日常生活中,我们经常需要查找电话号码。如果电话号码是按照一定顺序排列的,比如按照姓氏的首字母顺序排列,那么我们就可以使用二分查找来快速定位该电话号码。

        2. 字典单词查找

        在阅读英文书籍时,如果遇到了一个陌生的单词,想要知道它的意思,就可以使用二分查找来在字典中查找这个单词。

        3. 在有序数组中查找元素

        二分查找还可以用于在有序数组中查找特定的元素。例如,在一个已经排序的列表中查找一个特定的数字,或者在一个已经排序的字符串中查找一个特定的子串。

        4. 处理 “ 近似查找 ” 的问题

        除了查找精确匹配的元素,二分查找还可以用于处理 “ 近似查找 ” 的问题。例如,可以查找第一个大于等于某个值的元素的位置,或者查找最后一个大于等于某个值的元素的位置。

  • 14
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值