python中的归并排序

https://www.bilibili.com/video/av17888875?from=search&seid=17019827770934522690 

归并排序算法的时间复杂度:O(NlogN)

假设使用归并排序算法排序好规模为N的列表需要时间为T(N),则是用归并排序算法的细节是:将长度为N的列表划分成2个长度为N/2的列表,分别使用归并排序算法排序好将消耗时间2*T(N/2),再将两个排序好的有序子序列进行归并(merge),归并的过程就是不断的比较和消去,将2个长度为N/2的列表归并所需要消耗的时间复杂度就等于两个子列表中的元素个数N为O(N),最终得到排序好的列表。

则计算复杂度的递推公式为:

T(N)=2*T(N/2)+O(N)

解为  T(N)=O(Nlog(N))

'''
python中归并排序算法的实现(递归实现)
'''

def merge_sort(array):
    # print(array)
    n=len(array)
    if n==1:
        return array
    mid=n//2
    left=merge_sort(array[:mid])
    right=merge_sort(array[mid:])
    return merge(left,right)
def merge(left,right):
    out=[]
    while left and right:
        p1=left[0]
        p2=right[0]
        if p1<=p2:
            out.append(left.pop(0))
        else:
            out.append(right.pop(0))
    if left:
        out.extend(left)
        #注意,这里left最后剩下的元素可能不止一个,使用extend使得将列表中的所有元素添加到out列表中
        #不能写成out.append(left)
        #还可以写成out+=left
    if right:
        out.extend(right)
    return out
if __name__=='__main__':
    a=[54,26,93,17,77,31,44,55,20]
    assert merge_sort(a)==sorted(a)
    print(merge_sort(a))
    '''
    https://www.bilibili.com/video/av17888875/?p=2
    函数的嵌套调用/递归调用的执行过程:就是不断改变函数的输入实参,等待返回值,从而能够返回上一级调用的过程
    递归算法的执行过程:(每次调用merge_sort函数的时候,代码执行顺序就是读代码的顺序)
    merge_sort([54,26,93,17,77,31,44,55,20])
        mid=4
        left=merge_sort([54,26,93,17])#进入下一级调用,等待返回值
            mid=2
            left=merge_sort([54,26])#进入下一级调用
                mid=1
                left=merge_sort([54])
                    n=1
                    return [54]
                left=[54]#得到返回值之后,退回到上一级调用过程
                right=merge_sort([26])
                    n=1
                    return [26]
                right=[26]#得到返回值
                进行在当前级别中的排序代码段(将两个分别排序好的列表合并成一个大的排序好的列表)
                merge(left,right)=[26,54],返回上一级调用
            left=[26,54]返回调用
            right=merge_sort([93,17])  
                mid=1
                left=merge_sort([93])
                    n=1
                    return [93]
                返回值left=[93]
                right=merge_sort([17])
                    n=1
                    return [17]
                返回值right=17
                merge([93],[17])
                返回值[17,93]
            返回值right=[17,93]
            merge(left=[26,54],right=[17,93]) 
            将返回值[17,26,54,93]返回上一级调用
        返回值left=[17,26,54,93]
        进入当前调用的下一行代码
        right=merge_sort([77,31,44,55,20])
        调用过程类似,得到返回值
        right=[20,31,44,55,77]
        然后将left=[17,26,54,93]和right=[20,31,44,55,77]合并
        得到[17, 20, 26, 31, 44, 54, 55, 77, 93]
    返回 [17, 20, 26, 31, 44, 54, 55, 77, 93]
            
                        
    
    '''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值