python算法与数据结构——搜索

搜索是指查找一个数列中一个元素是否存在

二分查找(折半查找)

条件:
  ① 要求处理的数列是经过排序的,
  ② 操作对象支持下标索引,也就是说元素要连续,那么也就是只能处理顺序表
算法过程:
  一,将游标定位到中间位置,判断目标数字T与当前的数字(N)的大小,如果T大于N,则向右查找,反之,向左迭代查找

时间复杂度:
  最坏情况:O(log(n))[对半查找,2x=n]
  最优情况:O(1)[要找的数刚好在中间]

def binary_search(alist,item):
    '''alist为从小到大排的有序数列'''
    n=len(alist)
    if n<=0:
        return False
    mid=n//2
    if alist[mid]<item:
        return binary_search(alist[mid+1:],item)
    elif alist[mid]>item:
        return binary_search(alist[:mid],item)
    else:
        return True
#    return False

def binary_search2(alist,item):
    head=0
    rear=len(alist)-1    
    while head<=rear:
        mid=(head+rear)//2
        if alist[mid]==item:
            return True
        elif alist[mid]>item:
            rear=mid-1
#            rear-=1,这里要注意
        else:
            head=mid+1
#            head+=1
    return False
def binary_search1(alist,num,left,right):
    '''自创的,可行'''    
    if left>right:        
        return False
    mid=(left+right)//2
    if num<alist[mid]:
        right=mid-1        
        return binary_search1(alist,num,left,right)
    elif num==alist[mid]:       
        return True
    else:
        left=mid+1
        return binary_search1(alist,num,left,right)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值