java TimSort算法思路理解

前言

今天線上環境報了個錯:

java.lang.IllegalArgumentException: Comparison method violates its general contract! 
at java.util.TimSort.mergeHi(TimSort.java:899) ~[?:1.8.0_111] 
at java.util.TimSort.mergeAt(TimSort.java:516) ~[?:1.8.0_111] 
at java.util.TimSort.mergeCollapse(TimSort.java:441) ~[?:1.8.0_111] 
at java.util.TimSort.sort(TimSort.java:245) ~[?:1.8.0_111] 
at java.util.Arrays.sort(Arrays.java:1512) ~[?:1.8.0_111] 
at java.util.ArrayList.sort(ArrayList.java:1454) ~[?:1.8.0_111]

百度了下,ArrayList排序,1.7開始,使用TimSort進行排序。而TimSort增加了自反性檢查,不滿足自反性時,會報錯。
TimSort的實現原理是什麼,基於源碼、結合網上的一些博文,自我理解並進行記錄。

java doc介紹

英文介紹

A stable, adaptive, iterative mergesort that requires far fewer than n lg(n) comparisons 
when running on partially sorted arrays, 
while offering performance comparable to a traditional mergesort when run on random arrays. 
Like all proper mergesorts, this sort is stable and runs O(n log n) time (worst case). 
In the worst case, this sort requires temporary storage space for n/2 object references; 
in the best case, it requires only a small constant amount of space. 

This implementation was adapted from Tim Peters's list sort for Python, 
which is described in detail here: http://svn.python.org/projects/python/trunk/Objects/listsort.txt 
...

含義

一種穩定的、自適應的、迭代的合併排序,
在部分已排序的數組上運行時,時間複雜度遠小於NLg(N),在隨機數組上運行時性能開銷和傳統的合併排序相當。
和其他算法算法已有,本算法的表現是穩定的。
時間複雜度:最壞情況下爲O(N
Lg(N));
空間複雜度:最壞情況爲N/2,最好的情況爲常數級。

算法實現,基於Tim Peters’s的Python版實現進行改編。原文地址:http://svn.python.org/projects/python/trunk/Objects/listsort.txt


思路

舉個例子:
看書的方法,一種是看完所有章節,然後進行內容回顧;另一種是先看完第一章,回顧第一章,然後看完第二章,回顧第一章、第二章,將兩章內容進行串聯,接着按同樣的方式看第三章、… 等,直到看完全書。

冒泡、歸併排序等,採用的是第一種思路,一次性對數組內所有數據進行處理。
TimSort,主體思路,採用的是第二種,把一個大數組,分爲N部分來處理。先對第一部分數據排序(即0/N - 1/N),然後對第二部分數據進行排序(即1/N - 1/N),接着有序合併第一部分、第二部分數據。同樣道理,對第三部分、…、第N部分數據進行處理,最終輸出排序後的結果。

TimSort在上述主體思路上,加入了一些處理手段。
如數組很小,不分步,一步處理到位(TimSort#binarySort);
對每一個部分的數據進行排序時,先識別有序部分並進行快速處理,然後對該部分剩餘無序部分進行二分插入排序(TimSort#binarySort)

這個算法目的,個人理解:
真實情況下,需要排序的內容有各種各樣的可能。如隨機、部分有序(正序or反序)、已全部排序(正序or反序)。
爲了提高排序效率,應對各種可能的場景,調整了實現邏輯,優化排序效率。


參考資料

https://blog.csdn.net/bruce_6/article/details/38299199

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章