归并排序
说明
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案处理合并,即分而治之)。

可以看到这种结构很像一棵完全二叉树,通常归并排序采用递归方法实现,递归深度为log2n。
代码实现
1 | public class MergeSort implements Sorter { |
分析
时间复杂度
归并排序的时间复杂度是O(NlogN)。
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?
归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(NlogN)。
稳定性
归并排序是稳定的算法,它满足稳定算法的定义。
算法稳定性 – 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!
TimSort
java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。
参考
图解排序算法(四)之归并排序
https://www.cnblogs.com/chengxiao/p/6194356.html
Java实现归并排序
https://www.cnblogs.com/of-fanruice/p/7678801.html
timsort
http://svn.python.org/projects/python/trunk/Objects/listsort.txt
还有一篇有意思的:
如何找出Timsort算法和玉兔月球车中的Bug
http://www.freebuf.com/vuls/62129.html