算法介绍
归并排序的算法逻辑为把两个有序的数组归并为一个有序的数组。
举个例子,对于一个长度为8的数组,有两种归并方式
自顶向下的归并:
- 先分为[0-3],[4-7],左右有序后再归并到一起就变成一个完整的有序数组了
- 让[0-3]有序又可以分为[0-1]、[2-3]有序,递归下去,最终归并为[0-3]有序
自底向上的归并:
- 先让[0-1],[2-3],[4-5],[6-7]有序
- 再让[0-3],[4-7]有序
- 最终归并[0-7],让整个数组有序
归并实现
1 | /** |
下面这张原地归并轨迹的样例图来自于《算法》第四版,左侧为arr,右侧为temp数组
自顶向下的归并
1 | /** |
自底向上的归并
1 | /** |
完整代码
javascript实现
1 | /** |
java实现
1 | package com.algs; |
总结
- 稳定。
- 非原地排序。
- 时间复杂度为NlogN
- 空间复杂度为N
- 归并排序的主要缺点是辅助数组所使用的额外空间和N的大小成正比
- 归并排序的递归使小规模问题中方法的调用过于频繁。使用插入排序处理小规模的子数组(比如长度小于15)一般可以将归并排序的运行时间缩短10%-15%
- 当数组长度为2的幂时,自顶向下和自底向上的归并排序所用的比较次数和数组的访问次数正好相同,只是顺序不同。其它时候,两种方法的比较和数组的访问次序会有所不同
GitHub:https://github.com/AlbertKnag/algs-practice
上一篇:排序算法04:希尔排序
下一篇:排序算法06:快速排序