日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

TimSort算法分析

發(fā)布時間:2025/7/25 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TimSort算法分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Timsort是一種混合穩(wěn)定的排序算法,采用歸并排序混合插入排序的設(shè)計,在多種真實數(shù)據(jù)上表現(xiàn)良好。

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

它于2002年由Tim Peters在Python編程語言實現(xiàn)。

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

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

?

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

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

2. 將上面的一個個run入棧, 當棧頂?shù)膔un的長度不滿足下列約束條件中的任意一個時,則使用歸并排序?qū)⑵渲凶疃痰?個run合并成一個新的run,最終棧=1的時候,排序完成。

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

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

?

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

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

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

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

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

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

?

最后來一張歸并排序的動態(tài)圖片:

?

轉(zhuǎn)載于:https://www.cnblogs.com/brucecloud/p/6085703.html

總結(jié)

以上是生活随笔為你收集整理的TimSort算法分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。