python实现二分查找(非递归和递归方式)

二分查找,非递归方法实现

def bin_search(lis,num):
    left=0
    right=len(lis)-1 #每次为取得中间的索引,因为索引是从0开始的
    #比如列表中有六个数 (6-1)//2 =2 ,5个数(5-1)//2=2。如果不这样,在取得索引在减1,此时就需要考虑到列表中的数据是基数还是偶数
    while left <= right:#循环条件
        mid=(left+right)//2
        if num < lis[mid]:#查询数据比中间数据小,就往左查询
            right=mid-1 #到左边后,边界为中间数-1
        elif num > lis[mid]:
            left=mid+1#到右边后,边界为中间数+1
        else:
            return lis[mid] #查询的数与mid刚刚相等,则返回mid中间数。如果返回的是mid,则返回的是索引
    return -1 #如果循环结束,左边大于右边,还没有查询到,则返回-1,代表没有查询到
lis =[11,21,43,55,3,2,54,21,44,66]
print(lis)
lis.sort()
print(lis)
print(type(lis))
while 1:
    num = int(input('输入需要查询的数据:'))
    res=bin_search(lis,num)
    if res==-1:
        print('未找到')
    else:
        print('找到了',res)

二分查找,通过递归实现

def search_num(lis,num,left,right): #lis代表列表、num代表需要查找的数,left、right为索引
    if left>right:
        return -1
    #获取中间索引
    mid=(left+right)//2 #//代表整除
    if num < lis[mid]:
        right=mid-1
    elif num > lis[mid]:
        left=mid+1
    else:
        return lis[mid]
    return search_num(lis,num,left,right)
#需接收参数,不然会返回None
lis=[1,5,87,55,7,33,44,65,33,23]
lis.sort()
print(search_num(lis,23,0,len(lis)-1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值