归并排序最吸引人的性质是它能保证将任意长度为 N 的数组排序所需时间和 NlogN 成正比;它的主要缺点是它需要的额外空间与 N 成正比。

原地归并

归并排序 - 图1

归并排序 - 图2

自顶向下的归并排序

归并排序 - 图3

归并排序 - 图4

归并排序 - 图5
归并排序 - 图6

命题 F 和 G 告诉我们归并排序所需时间和 NlgN 成正比。这使得它非常适合对庞大数组进行排序。

对小规模子数组使用插入排序

插入排序非常适合处理小规模问题,所以再归并时通过插入排序处理小规模子数组,可以将整体排序时间缩短 10%~15%。

归并排序 - 图7

自底向上的归并排序

相较自顶向下,这个代码简单一些。
归并排序 - 图8

归并排序 - 图9

排序算法的复杂度

通过计算复杂度理解问题自身固有的难易程度,进而找到准确的上下界,让我们既有优化算法的动力,又不至于为不可能的性能改进投入资源。

下面就是证明排序算法的复杂度:
归并排序 - 图10
归并排序 - 图11

归并排序 - 图12

归并排序 - 图13

答疑

归并排序 - 图14