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的代碼實現~
?
最后來一張歸并排序的動態圖片:
?
轉載于:https://www.cnblogs.com/brucecloud/p/6085703.html
總結
以上是生活随笔為你收集整理的TimSort算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Web API] 如何让 Web AP
- 下一篇: springMVC注解@initbind