一.归并排序的优缺点(pros and cons)
耗费心思来理解它,总要有个理由吧:
缺点:
P.S.本文只讨论最原始的“两路归并”,多路的与之类似
二.内部原理
首先要知道归并排序的思想是:分治法,与快速排序的思想一样
算法思想:无序 -> 部分有序 -> 整体有序
归并排序中“分”与“合”的过程是结合在一起的,即每一趟都在做“分”与“合”的工作,并不是先“分”完再“合”(“分”很简单,不就是一直二分二分直到不可再分呗,额,这么想就错了,分完就合不起来了,切记“分”与“合”是结合在一起的)
用一幅图来解释归并排序的过程就足够了:
说明:P1与P2比较,将较大(小)者装入P,然后P1或者P2右移(装了谁就移谁),最后P右移
比如要对数组a[n]做升序排序,那么具体过程如下:
现在想想我们做完一趟排序得到了什么?
还不够清晰?那么还有几句话:
三.实现细节
如果上面的解释还不够清晰,那么我们来举个例子,一步步分析:
假定待排序序列为a[] = {3, 2, 1, 4},那么具体过程是这样的:
P.S.如果待排序序列是奇数个怎么办?这是问题吗?无非是拆得的前一半比后一半少一个而已,单趟循环控制是由P指针来做的,不存在某个P1没有与之配对的P2可以比的问题
四.总结
归并排序多用于需要外部排序的场景,除此之外当内部排序需要保证稳定性时也采用归并排序(不要求稳定性的内部排序一般采用快排或者堆排序,前者在待排序序列基本有序时效率低,后者堆的维护是个问题)