python算法与数据结构013--二分查找的实现

本文介绍了二分查找算法的递归与非递归两种实现方式,并分析了其最优及最坏的时间复杂度。通过具体示例代码展示了如何在有序列表中高效查找指定元素。

最优时间复杂度: O(1)

最坏时间复杂度:  O(logn)

递归实现:

#利用递归实现的二分查找
def binarySearch(dataList,data,start,end):
    #在dataList的start,end之间查找数据data的坐标
    print("查找范围:---" + str(start) + ":" + str(end))
    if start>end:
        print("元素不在此列表中")
        return

    if start==end :
        if dataList[start]==data:
            print("已经找到该元素,坐标为:" + str(start))
        else:
            print("元素不在此列表中")
        return

    if end-start==1:
        if dataList[start]==data:
            print("已经找到该元素,坐标为:" + str(start))
        elif dataList[end]==data:
            print("已经找到该元素,坐标为:" + str(start))
        else:
            print("元素不在列表中")
        return

    mid = (start+end)//2

    if dataList[mid] == data:
        print("已经找到该元素,坐标为:" + str(mid))
        return
    elif dataList[mid] > data:
        binarySearch(dataList,data,start,mid)
    else:
        binarySearch(dataList,data,mid,end)

dataList = [1,2,3,4,5,6,7,8,9,10,11,23,23,24,32,45,89,99,100,101,101,102,234,245,290]
len(dataList)
binarySearch(dataList,299,0,24)

非递归实现:

#非递归实现二分查找
def binarySearchNor(dataList,item):
    """
    :param dataList: 有序序列
    :param item: 要查找的元素值
    :return: 元素坐标值,返回-1表示没有找到该元素
    """
    if len(dataList) == 1:
        if dataList[0] == item:
            return 0
        else:
            print -1
        return
    #当序列长度大于1,可进行二分查找
    start = 0
    end = len(dataList)-1
    while start < end :
        mid = (start+end)//2

        #当start和end只相差1的时候,mid=start,此时退出循环
        if mid == start:
            break
        if dataList[mid] == item:
            return mid
        elif dataList[mid] > item:
            end = mid
        else:
            start = mid

    if dataList[start] == item:
        return start
    elif dataList[end] == item:
        return end
    else:
        return -1


dataList = [1,2,3,4,5,6,7,8,9,10,11,23,23,24,32,45,89,99,100,101,101,102,234,245,290]
print(binarySearchNor(dataList,7))
print(binarySearchNor(dataList,11))
print(binarySearchNor(dataList,999))
print(binarySearchNor(dataList,1))
print(binarySearchNor(dataList,-1))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值