zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Scratch-Blockly配置过程
    Scratch www 系统搭建
    Scratch3.0——项目层次结构
    用canvas播放scratch文件
    Scratch3.0——克隆代码仓库的正确姿势
    Scratch3.0——作品截图
    Scratch GUI
    Ubuntu下Visual Studio Code的配置
    关于Ubuntu16.04下phpmyadmin出现mbstring错误的正解
    ubuntu搭建LAMP全教程及简单使用
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9948111.html
Copyright © 2011-2022 走看看