归并排序法是一种高效的排序算法,采用分治策略,将数组分成若干小部分分别排序,再合并成一个有序的大数组,适用于大数据量排序。
步骤
其主要算法操作可以分为以下步骤:
Step 1:将n个元素分成两个含n/2元素的子序列
Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)
Step 3:合并两个已排序好的序列
易知,MS的关键在于Merge过程。对于这一过程的理解,算法导论中给出了一个形象的模型。
即假设桌面上有两堆已排序好的的牌,且每一堆都正面朝下放置。然后我们分别从两堆牌中选取顶上的一张牌(选取之后,堆顶端又会露出新的顶牌),选取较小的一张,放入输出堆,另一张放回。
重复这一步骤,最后直到一堆牌为空。由于两堆牌都是已排序,所以可知,只要将剩下的那堆牌盖到输出堆即完成整个排序过程。
小插曲
算法导论为了简化伪代码,在此处用了两张值为∞的哨兵牌。这样,除非两堆都露出哨兵牌,否则所取的两张牌中必有最小值。这一设想避免了检查每一个堆是否是空的,但是由于无法在程序中表示哨兵牌(或许可以,只是我不知道罢了),我们只能在实际算法中放弃这一设想。
对于A=<5,2,4,7,1,3,2,6>数组,MS的大致操作流程:
在递归的合并过程中,我们需要动态的创建一个缓存区,作为上面较小牌的输出堆。一次合并完毕之后,用缓存区的数据覆盖原始相应数组的数据。
于是乎,我们可以上面的思路,写出下面的相应代码(注意边界成立的条件)