该算法基于一个简单的操作: 将两个有序的队列合成一个更大的有序队列。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1EjMwgDNwADMwIDMyADMxgTMwIzLcVDM0EDMy8CXvZmbp9CXt92YuUGZvNWatFWbuU2Zh1Wavw1LcpDc0RHaiojIsJye.png)
归并排序保证nlogn。
原地归并的抽象算法(abstract in-place merge):
如何确定i, j, k 的取值,根据下图可以观察出他们的规律:
top-down mergesort
自顶向下的归并排序是基于原地归并排序的递归实现。是分治思想的典型例子。
代码如下:
bottom-up mergesort:
这种方法是先归并较小的,然后才是较大的,这样避免了递归调用:
观察下图就可以得出上面的算法,注意下图的sz = 1, 2 ,4...而不是 2,4, 8...:
总体感觉这种分析方法很重要,如果把这些分析过程搞明白了,代码很容易。以后得改掉先代码后想的习惯。