TimSort算法分析


Timsort是一種混合穩定的排序算法,采用歸並排序混合插入排序的設計,在多種真實數據上表現良好。

它基於一個簡單的事實,實際中大部分數據都是部分有序(升序或降序)的。

它於2002年由Tim Peters在Python編程語言實現。

Timsort排序算法中定義數組中的有序片段為run,每個run都要求單調遞增或嚴格單調遞減(保證算法的穩定性),如下圖:

文中圖片都是我手繪的,字寫的難看了點,將就看吧~

 

Timsort排序算法可以概括成兩步:

1. 把待排序數組分成一個個的run(即單調上升的數組), 並且run不能太短, 如果run的長度小於minRun這個閥值, 則使用插入排序進行填充

2. 將上面的一個個run入棧, 當棧頂的run的長度不滿足下列約束條件中的任意一個時,則使用歸並排序將其中最短的2個run合並成一個新的run,最終棧=1的時候,排序完成。

  ① runLen[n-2] > runLen[n-1] + runLen[n]

  ② runLen[n-1] > runLen[n]

 

下面用一個例子進行說明,假設minRun=5,也就是說run的最小長度不能小於5,如果小於5則使用插入排序進行填充。每划分出一個run就將其入棧,如下圖所示:

注意:此時棧頂的run是不滿足約束條件的,因為此時runLen[0] < runLen[1],所以要對這兩個run進行歸並,這個過程使用的是歸並排序。

如果遇到run的長度小於minRun的情況,則需要進行填充,直到run的長度=minRun或者數組結束為止,如下圖:

至此排序完成~~~有的同學可能會有疑問,為什么要有那個奇怪的約束條件呢?每次入棧的時候直接進行歸並不行嗎?這主要是考慮到歸並排序的效率問題,

因為將一個長序列和一個短序列進行歸並排序從效率和代價的角度來看是不划算的,而兩個長度均衡的序列進行歸並排序時才是比較合理的也比較高效的。

這里只是簡單的闡述了一下TimSort的思想原理,具體實現還是有很多細節需要考慮的,下一篇文章會分析JDK1.8中TimSort的代碼實現~

 

最后來一張歸並排序的動態圖片:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM