找回密码
 中文实名注册
查看: 208|回复: 0

【四级】Python 二分查找-递归

[复制链接]

695

主题

1083

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22833
发表于 2021-8-23 11:13:56 | 显示全部楼层 |阅读模式

'二分查找 叫折半查找,它对要查找的序列有两个要求,一是该序列必须是有序的,二是该序列必须是顺序存储的。'

#1. _list[mid] == value: 中间值恰好是我们需要查找的值,那么直接返回对应的索引就可以了。
#2. _list[mid] > value:  要查找的值在mid的左侧,更新end 的值为mid,缩小查找范围。
#3. _list[mid] < value:  要查找的值在mid的右侧,更新start 的值为mid,到 mid 右侧进行查找。


二分搜索是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

[Python] 纯文本查看 复制代码
_list = [1, 3, 4, 5, 6, 7, 8, 9]
value=int(input('请输入要查找的数'))
start = 0   # 列表的起始索引
end = len(_list)   # 列表的结束索引

while start < end:
    mid = int((end + start)/2)  # 采用此方法,通过四舍五入刚好可以定位到列表的中间位置
    print(f'本次比较的区间是【{start}:{end}】')
    print(f'比较的中间数是:{mid}')
    if _list[mid] == value:
        break
    elif _list[mid] > value:
        end = mid - 1
    else:
        start = mid + 1
else:
    mid= -1  #数字没有查到

index = "输入的数{}在列表中的第{}个"
print(index.format(value,mid))


[Python] 纯文本查看 复制代码
# 返回 x 在 arr 中的索引,如果不存在返回 -1
def binh(arr, l, r, x):

    # 基本判断
    if r >= l:
        mid = int(l + (r - l)/2)
        # 元素整好的中间位置
        if arr[mid == x:
            return mid
        # 元素小于中间位置的元素,只需要再比较左边的元素
        elif arr[mid > x:
            return binh(arr, l, mid-1, x)
        # 元素大于中间位置的元素,只需要再比较右边的元素
        else:
            return binh(arr, mid+1, r, x)
    else:
        # 不存在
        return -1


# 测试数组
arr = [2, 3, 4, 10, 40]
x = 10

# 函数调用
result = binh(arr, 0, len(arr)-1, x)

if result != -1:
    print("元素在数组中的索引为 %d" % result)
else:
    print("元素不在数组中")

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?中文实名注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2024-5-5 19:28 , Processed in 0.040083 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表