zoukankan      html  css  js  c++  java
  • 归并排序

    本文参考《算法导论》,整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/大笑

    归并排序时间复杂度:CodeCogsEqn,非原址排序。

    归并排序和快速排序一样,都遵循分治模式:

    • 分解:分解待排序的 n 的元素的序列各具 n/2 个元素的两个序列。
    • 解决:使用递归排序递归的排序两个子序列。
    • 合并:合并两个已排序的子序列以产生已排序的答案。

    归并算法的关键操作是“合并”。我们通过调用一个辅助过程MERGE(A,p,q,r)来完成合并,该过程假设子数组A[p..q]和A[q+1..r]都已经排好序。它合并这两个子数组并代替当前的子数组A[p..r]。

    过程MERGE按照以下工作方式进行:

    假设桌面上有两堆牌面朝上的牌,每堆都已排好序,最小的牌在顶上。我们希望把两堆牌合并成单一的排好序的输出堆,牌面朝下的放在桌上。基本步骤:

    • 在牌面朝上的两堆牌的顶上两张牌中选取较小的一张。
    • 将该牌从其堆中移开并朝下地将该牌放置到输出堆。
    • 重复这个步骤,直到一个输入堆为空。
    • 拿起剩余的输入堆牌面朝下放置到输出堆。

    伪代码如下:

    imageimage

    把,过程MERGE作为归并算法中的一个子程序来用。下面的过程MERGE-SORT(A,p,r)排序子数组A[p..r]中的元素。若p>=r则最多只有一个元素,已经排好序。否则,分解步骤简单的计算一个下标q,将A[p..r]分成两个子数组,递归排序,在合并:

    image

    举个例子:归并排序在数组A=[5,2,4,7,1,3,2,6]上的操作:

    image

    总结:归并排序时间复杂度:CodeCogsEqn,非原址排序。

  • 相关阅读:
    Hadoop: No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).解决办法
    Libnfc
    生产服务GC调优实践及基本流程总结
    万年历算法
    C#中操作Oracle时的SQL语句参数的用法
    对DataGrid的初步了解
    C#中HashTable的用法
    正则表达式
    C#动态调用WebService
    Ubuntu 故障处理笔记
  • 原文地址:https://www.cnblogs.com/hust-ghtao/p/4490695.html
Copyright © 2011-2022 走看看