二分法查找

二分法查找

# 给定一个有序(升序)的列表与待查找的关键字,成功则返回其索引,失败则返回-1。
def halfsearch(a,x):
    left=0
    right=len(a)-1
    mid=(left+right)//2
    while(left<=right):
        if a[mid]==x:
            return mid
        if a[mid]>x:
            right=mid-1
        else:#a[mid]<x
            left=mid+1
        mid=(left+right)//2
    return -1

a=[1,2,2,3,4,6,7,8]
x=2
print(halfsearch(a,x))
        
# 二分法查找小于等于x的最大数
def halfsearch(a,x):
    left=0
    right=len(a)-1
    mid=(left+right)//2
    while(left<=right):
        if a[mid]>x:
        	#若是小于x的最大数,这里应为a[mid]>=x
            right=mid-1
        else:#a[mid]<=x
            left=mid+1
        mid=(left+right)//2
    return right

a=[1,2,2,3,4,6,7,8]
x=2
print(halfsearch(a,x))
#out:2        
# 二分法查找大于等于x的最小数
def halfsearch(a,x):
    left=0
    right=len(a)-1
    mid=(left+right)//2
    while(left<=right):
        if a[mid]>=x:
        	#若是大于x的最小数,这里应为a[mid]>x
            right=mid-1
        else:#a[mid]<x
            left=mid+1
        mid=(left+right)//2
    
    if left==len(a):
        return -1
    return left

a=[1,1,1,3,4,6,7,8]
x=9
print(halfsearch(a,x))
        

思想:

针对有单调性的问题。
问法多数是最小值最大等等。

时间复杂度:

枚举时间复杂度是O(n),而二分是O(logn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值