Python实现顺序查找和二分查找

一、顺序查找

# 顺序查找(线性查找)示例


def linear_search(data, key):
    lens = len(data)
    for i in range(lens):
        if data[i] == key:
            return i
    return -1


if __name__ == '__main__':
    values = [10, 34, 56, 9, 12, 3, 76, 45, 99, 84, 25, 67]

    # 查找数据50
    result = linear_search(values, 50)
    if result == -1:
        print('未找到该数据')
    else:
        print('该数据对于的下标为:{}'.format(result))

    # 查找数据25
    result = linear_search(values, 25)
    if result == -1:
        print('未找到该数据')
    else:
        print('该数据对于的下标为:{}'.format(result))

  • 顺序查找:从待查找数据的第一个元素开始,逐个将每个元素与要查找的数据值进行对比:如果比较到两者值相同,则查找成功;如果一直到最后都未找到,则查找失败。
  • 特点: 不要求数据本身有序
  • 劣势: 当数据集合较大时,查找效率低

二、二分查找(折半查找)

# 二分查找(折半查找)示例


# 递归实现
def binary_search_recur(data, key, left_index, right_index):
    if right_index < left_index:
        return -1
    middle = (left_index + right_index) // 2
    if data[middle] == key:
        return middle
    elif data[middle] > key:
        return binary_search_recur(data, key, left_index, middle-1)
    else:
        return binary_search_recur(data, key, middle+1, right_index)


# 循环实现
def binary_search_loop(data, key):
    left_index = 0
    right_index = len(data) - 1
    while left_index <= right_index:
        middle = (left_index + right_index) // 2
        if data[middle] == key:
            return middle
        elif data[middle] > key:
            right_index = middle - 1
        else:
            left_index = middle + 1
    return -1


if __name__ == '__main__':
    values = [10, 34, 56, 9, 12, 3, 76, 45, 99, 84, 25, 67]
    # 将表格按照升序排列
    values.sort()
    # 二分查找 - 递归方式
    print("二分查找 - 递归方式:")
    # 查找数据50
    result = binary_search_recur(values, 50, 0, len(values)-1)
    if result == -1:
        print('未找到该数据')
    else:
        print('该数据对于的下标为:{}'.format(result))
    # 查找数据25
    result = binary_search_recur(values, 25, 0, len(values) - 1)
    if result == -1:
        print('未找到该数据')
    else:
        print('该数据对于的下标为:{}'.format(result))

    # 二分查找 - 循环方式
    print("二分查找 - 循环方式:")
    # 查找数据50
    result = binary_search_loop(values, 50)
    if result == -1:
        print('未找到该数据')
    else:
        print('该数据对于的下标为:{}'.format(result))
    # 查找数据25
    result = binary_search_loop(values, 25)
    if result == -1:
        print('未找到该数据')
    else:
        print('该数据对于的下标为:{}'.format(result))

  • 二分查找(折半查找):找出有序数据中的中间元素,有中间元素值将原数据分为两个子表,然后根据指定查找值与中间元素的大小关系进行比对:若相对,则查找成功;若查找值小于中间元素,则在左侧子表中继续查找;若查找值大于中间元素,则在右侧子表中继续查找。如此递归查找下去,直到查找成功或查找完整个数据集合为止。
  • 优势: 每次查找之后,搜索范围减半
  • 特点: 要求数据本身有序在这里插入图片描述
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值