简单讲解二分查找以及两种版本代码实现

二分查找

        二分查找又称折半查找,它是一种效率较高的查找方法

原理

         将数组分为三部分,依次是中值前,中值,中值后
        
        将要查找的值与中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,
等于中值时直接返回      

要求:

        ①必须采用顺序存储结构
        ②必须按关键字大小有序排列
  

递归版本

         第一步: 找到中值(取整数)
        第二步: 要查找的数和中值比较
        第三步: 若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回
代码如下:
# 1.定义函数,二分查找
def binary_search(my_list,item):
    """
    二分查找函数
    :param my_list: 要查找的列表 必须有序
    :param item: 要查找的元素
    :return: 查找结果,找到True,未找到False
    """
    # 1.1 获取列表的长度
    n = len(my_list)
    # 1.2 如果长度小于等于0,直接return 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]:
        end = mid -1
    # 1.6 如果要查找的值 > 中间值,就去: 中间值的右边找
    else:
        start = mid +1

# 2.定义main函数,测试
if __name__ == '__main__':
    # 2.1 定义列表,记录:要查找的元素
    my_list = [9,21,55,76,89,99]
    # 2.2 调用函数,二分查找,获取结果
    result = binary_search(my_list,21)
    # 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 = [9,21,55,76,89,99]
    # 2.2 调用函数,二分查找,获取结果
    result = binary_search(my_list,20)
    # 2.3 打印结果
    print(f'查找结果为:{result}')

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值