算法原理
先把数据从中间分为前后两部分,然后对前后两部分分别排序,最后将排好序的合并到一起。
如何实现
- 递推公式:merge_sort(p, r) = merge(merge_sort(p, q), merge_sort(q+1, r))
- 终止条件:p >= r
算法稳定性
归并算法是否稳定,关键在于merge函数合并时的代码。在合并过程冲如果A[p, q]和A[q+1, r]中有值相同的元素,将A[p, q]中的元素放在temp前面,就可以保证算法的稳定性。
时间复杂度
- 分析归并算法时间复杂度就是分析递归代码的时间复杂度:T(a) = T(b) + T(c) + K(a问题可以分解为b和c子问题,K为合并所需用时间);
- 具体计算:T(1) = C; T(n) = 2 * T(n/2) + n = 2 * (2 * T(n/4) + n/2) + n = 4 * T(n/4) + 2 * n = 8 * T(n/8) + 3 * n = 16 * T(n/16) + 4 * n = ...... =2^k * T(n/(2^k)) + k * n = ......,当n/(2^k) == 1时,即k == log2n,递归结束。此时T(n) = Cn + nlog2n,因此归并算法时间复杂度为O(nlogn);
空间复杂度
- 归并算法不是原地排序算法;
- 空间复杂度并不像时间复杂度那样累加,即在每次合并的时候都会申请新的内存空间,但是合并之后就释放掉了,因此空间复杂度是O(n);
《数据结构与算法之美》 -- 王争