归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序的核心思想是将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。
分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之
归并操作的工作原理:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置;
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复第三步,直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾。
图解
归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序,性能良好。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
TimSort算法的详解链接:
https://www.jianshu.com/p/10aa41b780f2
本文内容参照 : 作者: dreamcatcher-cx
链接地址:
https://www.cnblogs.com/chengxiao/p/6194356.html