zoukankan      html  css  js  c++  java
  • 八大排序算法之归并排序

    算法思想:

      将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。

    实现步骤:

    1. “分解”——将序列每次折半划分
    2. “合并”——将划分后的序列段两两合并后排序

    图示:

      

    代码实现

    def get_number(num):
        import random
        lst = []
        i = 0
        while i < num:
            lst.append(random.randint(0,100))
            i += 1
        return lst
    
    
    def merge(left,right):
        i,j = 0,0
        result = []
        while i < len(left) and j < len(right):
            if left[i] <= right[j]:
                result.append(left[i])
                i += 1
            else:
                result.append(right[j])
                j += 1
        result += left[i:]
        result += right[j:]
        return result
    
    def mergesort(lst):
        if len(lst) <=1:
            return lst
        num = len(lst) // 2  # 取整数部分
        left = mergesort(lst[:num])
        right = mergesort(lst[num:])
        return merge(left,right)
    
    a = get_number(10)
    print("排序之前:",a)
    b = mergesort(a)
    print("排序之后:",b)
    
    #####输出结果##########
    排序之前: [23, 29, 8, 91, 85, 93, 39, 81, 24, 15]
    排序之后: [8, 15, 23, 24, 29, 39, 81, 85, 91, 93]

     性能分析

      时间复杂度:归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(n*log2n)

      空间复杂度:由前面的算法说明可知,算法处理过程中,需要一个大小为n的临时存储空间用以保存合并序列。

      算法稳定性:在归并排序中,相等的元素的顺序不会改变,所以它是稳定的算法。

    排序效果

  • 相关阅读:
    一个很好的在线测试编辑器(可以在线运行很多程序)
    基于angular的route实现单页面cnodejs
    微博
    jsonp跨域再谈
    打开IIS的快捷键
    PHPCMS笔记第二弹
    phpcms ——模板标签详细使用说明
    PHP流程管理,堪比小小程序
    PHP的简单易懂文件管理,可实现基本功能
    使用php ajax写省、市、区、三级联动
  • 原文地址:https://www.cnblogs.com/vipchenwei/p/7106385.html
Copyright © 2011-2022 走看看