python 数据结构与算法 day05 归并排序

1.归并排序

思路: 逐步把一个序列拆分,每次拆一半,直到拆成n个元素的序列,拆完之后开始合并,两个两个合并,合并完 之后再四个一组合并,依次合并为原来长度的序列;

整个过程使用递归

2. 代码实现

def merge_sort(L):
    """归并排序"""
    if len(L)==1:
        return L
    mid=len(L)//2
    left_list=merge_sort(L[:mid])
    right_list=merge_sort(L[mid:])
    left_pointer,right_pointer=0,0
    result=[]
    while left_pointer<len(left_list) and right_pointer<=len(right_list):
        if left_list[left_pointer]<right_list[right_pointer]:
            result.append(left_list[left_pointer])
            left_pointer+=1
        else:
            result.append(right_list[right_pointer])
            right_pointer+=1
    result+=left_list[left_pointer:]
    result+=right_list[right_pointer:]
    return result

L=[5,2,8,3,7,1,9,4]
L_sorted=merge_sort(L)
print(L)
print(L_sorted)

运行结果:

3. 时间复杂度

归并排序时间复杂度 nlog(n) 拆分之后合并的过程,横向复杂度n (因为总共需要比较n个元素);

纵向时间复杂度是log(n)因为从n个元素的序列逐步合并,最终合并为一个大的序列 2^k=n  合并的过程总共有log(n)次

所以归并排序的时间复杂度 nlog(n)

4. 稳定性

归并排序是稳定的;

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9948111.html