归并排序

本文参考《算法导论》,整理者:华科小涛@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,非原址排序。

posted @ 2015-05-09 17:08  华科小涛  阅读(258)  评论(0编辑  收藏  举报