2022.03.13

課時51 归并排序的时间复杂度

分为两部,拆分过程可以视为o(1),因为最终是分到只有一个元素。

而复杂的过程在于合并。

首先是一个与一个合并,接着是两两合并……如此类推。

每次合并的时间复杂度是n,而根据循环,要执行好几次。

所以循环内的时间复杂度是o(logn),而每次循环的时间复杂度是o(n)。

整个的时间复杂度是o(nlogn)。

时间来说是小的,但是在空间上来说,必须要一个空间来保存才能反映这个值。

所以空间上占用的内存比较大。

 

总结一下各个排序算法的效率。

其中,快速排序必须掌握。

课时52 搜索

 

简单来说,搜索就是在一个序列当中去查找某个元素是否存在。

传统上的搜索,就是一个一个元素去找,看看某个元素是否存在。

实际上我们可以模仿字典,实行二分法查找。

 这个查找法的特点在于,要求查找对象必须是排序过的序列,且元素必须是相邻的。

也就是二分查找只能用于有序的顺序表。

那么二分查找法又如何去找中间的下表呢?

假设要查找的元素是【4】.首先找到中间值是【7】.

如上图,为何认为【7】是中间呢?

首先,这个序列,起始的【1】下标为0,而尾部的【14】,下标为8.

那么中间值的下标,就应该是起始与终止的下标相加再除以2,也就是4.

那么中间值自然就是【7】.

接着因为【4】比【7】小,所以自然,要查找的元素应该在【7】的左边。

接着在【7】的左边求中间值。

【7】左边的中间值=0(起始下标)+3(【6】的下标)

取整,为1.即,中间值为【3】.

接着,因为【3】比【4】小,所以要查找的元素【4】应该在【3】的右边。

然后又计算【3】右边直到【7】为止的中间值。

也就是下标(2+3)//2,为2,即【4】.

def binary_search(alist,item):
    """二分查找,递归"""
    n=len(alist)

    if n>0:
        mid = n // 2
        if alist[mid]==item:
            return True
        elif item<alist[mid]:
            binary_search(alist[:mid],item)
        else:
            binary_search(alist[mid+1:],item)
    return False

def binary_search(alist,item):
    """二分查找,非递归"""
    n=len(alist)
    first=0
    last=n-1

    while first<=last:
        mid = (first + last) // 2
        if alist[mid]==item:
            return True
        elif item<alist[mid]:
            last=mid-1
        else:
            first=mid+1
    
    return False

 课时53 二分查找的时间复杂度

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值