• 归并排序(MergeSort)


    //版权所有 Anders06  于2007年10月25日


    归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。
    1、基本思想
    1 分治法的基本思想
    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

    2 归并排序的基本基本步骤
      设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。

    •   分解: 讲n个元素分成n/2 个元素的子序列
    •   解决: 用合并并排序对两个子序列递归地排序    (在对子序列排序时,长度为1时递归结束)
    •   合并: 合并两个已经排好序的子列序以得到排序结果  

        以扑克牌为例, 假设有两堆牌面朝上地放在桌上,每一堆都是排好序的,最小的牌在最上面。我们希望将两堆牌合并成升序的一堆牌。基本步骤包括在面朝上的两堆牌中,选择顶上两张较小的一张,将其取出放入到输出堆,重复此动作,知道有一堆为空为止,然后吧另一堆所剩下的牌面朝下放入到输出堆即可。 合并排序的时间为 O(n).

    2、 算法分析
    1)时间复杂度
        Merge过程运行的时间为O(n), 而我们总共分了lgn + 1(n为偶数的时候应该为lgn吧, 数学好久没读,头脑不好用咯),因此总的执行实际为nlgn + n,复杂度为 O(nlgn)
    2)空间复杂度
        O(n)
    3)稳定性
        为稳定算法

    C#实现的MergeSort

    MergeSort

    参考资料

    •     <<算法导论>>
  • 相关阅读:
    详解JavaScript中的this
    java静态代理与动态代理简单分析
    BZOJ1263 [SCOI2006]整数划分
    BZOJ1258 [CQOI2007]三角形
    BZOJ1237 [SCOI2008]配对
    BZOJ1257 [CQOI2007]余数之和
    BZOJ1103 [POI2007]大都市
    BZOJ1061 [NOI2008]志愿者招募
    BZOJ1050 [HAOI2006]旅行
    BZOJ1055 [HAOI2008]玩具取名
  • 原文地址:https://www.cnblogs.com/anders06/p/937560.html
Copyright © 2020-2023  润新知