归并排序
本文参考《算法导论》,整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/
归并排序和快速排序一样,都遵循分治模式:
- 分解:分解待排序的 n 的元素的序列各具 n/2 个元素的两个序列。
- 解决:使用递归排序递归的排序两个子序列。
- 合并:合并两个已排序的子序列以产生已排序的答案。
归并算法的关键操作是“合并”。我们通过调用一个辅助过程MERGE(A,p,q,r)来完成合并,该过程假设子数组A[p..q]和A[q+1..r]都已经排好序。它合并这两个子数组并代替当前的子数组A[p..r]。
过程MERGE按照以下工作方式进行:
假设桌面上有两堆牌面朝上的牌,每堆都已排好序,最小的牌在顶上。我们希望把两堆牌合并成单一的排好序的输出堆,牌面朝下的放在桌上。基本步骤:
- 在牌面朝上的两堆牌的顶上两张牌中选取较小的一张。
- 将该牌从其堆中移开并朝下地将该牌放置到输出堆。
- 重复这个步骤,直到一个输入堆为空。
- 拿起剩余的输入堆牌面朝下放置到输出堆。
伪代码如下:
把,过程MERGE作为归并算法中的一个子程序来用。下面的过程MERGE-SORT(A,p,r)排序子数组A[p..r]中的元素。若p>=r则最多只有一个元素,已经排好序。否则,分解步骤简单的计算一个下标q,将A[p..r]分成两个子数组,递归排序,在合并:
举个例子:归并排序在数组A=[5,2,4,7,1,3,2,6]上的操作: