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