排序和搜索(二)——python实现二分查找

 
【基本原理】
在上一篇有序列表的顺序查找中,我们假定列表是按照值排好序的,基于排序的列表,我们按照python列表索引从头开始比较。
而在二分查找中,我们先取中间索引位置,如果找到就返回;没找到(升序排序),如果中间位置的值大于待查项,则排除中
间位置的值和比中间位置值大的另一半元素,如果待查项在列表中,肯定存在于小的半部分。重复此过程知道找到,返回
反过来也一样
【二分查找分析】

列表有n项,第1次比较剩n/2,第2次比较剩n/4,第3次比较剩n/8,......,第i次比较剩n/2^i,最后剩一项,要么是,要么不是,故n/2^i=1,i=以2为底n的对数。因此二分查找是O(log^n)。需注意排序和查找的花销均衡

【代码】
#实现二分查找
def binarySearchBasic(alist,item):
    first=0
    last=len(alist)-1
    post=(first+last)//2
    found=False
    while not found and first<=last:
        if alist[post]==item:
            found=True
            print('找到了,位置在',post+1)
        elif alist[post]<item:
            first=post+1
        else:
            last=post-1
        post = (first + last) //2
    return found
print(binarySearchBasic([1,3,5,7,9,12,45,89,91,95,96,98],12))

#递归实现二分查找
def binarySearchByRec(alist,item):
    if len(alist)==0:
        return False
    else:
        post=len(alist)//2
        # print(post)
        if alist[post]==item:
             return True
        elif alist[post]<item:
            return binarySearchByRec(alist[post+1:], item)
        else:
            return binarySearchByRec(alist[:post], item)

print(binarySearchByRec([1,3,5,7,9,12,45,89,91,95,96,98],12))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值