python之二分查找

1. 顺序查找

顺序查找就是从列表的第一项开始,依次进行搜索,一直到列表最后或者找到元素为之。

例:从列表中按照顺序查找一个数字,存在返回下标,否则返回None
# 在一个列表中查找一个数,
# 如果存在返回该数字的下标,否则返回None
def f(data_list, value):
    for i in data_list:
        if value == i:
            return data_list.index(i)
            break
    else:
        return None


data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(f(data, 6))   # 输出5
print(f(data, 15))  # 输出None

2. 二分查找

注意:列表必须有序

思路:

  1. 先给定一个范围 比如:1-100
  2. 先找这个范围的一半mid,也就是数字50(下标为49)
  3. 如果找大了,则将最大范围设为 mid-1,此时范围为数字1-49(下标范围:0-48)
  4. 如果找小了,则将最小范围设为 mid+1,此时范围为数字50-100(下标范围:51-100)
  5. 重复2-4步骤,直到找到这个数字

例如:在1到100之间找1,会先找中间下标49,如果找大了 就往mid右边找,如果找的小了 就往mid左边找
在这里插入图片描述

data_list = [i for i in range(1, 101)]  # 带查找的列表
value = 2  # 要查找的数
left = 0  # 最左边下标
right = len(data_list) - 1  # 最右侧下标

x = 1
while left <= right:  # 左边下标小于右边下标,在列表这个范围找
    mid = (left + right) // 2  # 整除,取中间下标位置
    print('\n第{}次,取中间的下标为:{}'.format(x, mid))
    if data_list[mid] == value:  # 如果要查找的数字等于中间位置的数字时,则打印该索引
        print('这个数的下标为:', mid)
        break
    elif data_list[mid] > value:
        right = mid - 1
    else:
        left = mid + 1
    print('\t\tleft:{}, right:{}'.format(left, right))
    x += 1
else:
    print(None)
def search(data_list, value):
    """
    :param data_list: 待查找的列表
    :param value: 要查找的数字
    :return:下标或None
    """
    left = 0  # 列表最左边下标
    right = len(data_list) - 1      # 列表右边下标
    while left <= right:            # 左边下标小于右边下标,在列表这个范围找
        mid = (left + right) // 2   # 整除,取中间下标位置
        if data_list[mid] == value: # 如果要查找的数字等于中间位置的数字时,则返回该索引
            return mid
        elif data_list[mid] > value:# 如果mid大于要查找的数,将right重新赋值为中间下标的左侧(也就是mid-1)
            right = mid - 1
        else:
            left = mid + 1
        # print('mid:{}, left:{},right:{}'.format(mid, left, right))
    else:
        return None


a = [i for i in range(100)]
print(search(a, 2))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值