轉自: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能夠比的問題
四.總結
歸併排序多用於須要外部排序的場景,除此以外當內部排序須要保證穩定性時也採用歸併排序(不要求穩定性的內部排序通常採用快排或者堆排序,前者在待排序序列基本有序時效率低,後者堆的維護是個問題)