關於Java中Arrays.sort()方法TLE


最近一直在練用Java寫題,今天無意發現一道很簡單的二分題(鏈接),我一開始是直接開int[]數組調用Arrays.sort()去排序,沒想到TLE了,原來是因為jdk中對於int[]的排序是使用快速排序的,jdk中相關調用源碼如下

1     public static void sort(int[] a) {
2         DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
3     }
View Code

而測試數據恰好有反快排的數據,因此被卡。

 

解決方法也不少,比較簡單的是使用包裝類Integer去調用Arrays.sort,jdk對之的實現是基於timsort的,可以從如下的源碼看到相關調用。

1     public static void sort(Object[] a) {
2         if (LegacyMergeSort.userRequested)
3             legacyMergeSort(a);
4         else
5             ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
6     }
View Code

 

或者也可以用List,然后調用Collections.sort()。

 

當然還可以先shuffle一下打亂數組,再調用排序,不過其實理論上來說還是有風險。

 

CF上有一篇博文可以參考:http://codeforces.com/blog/entry/7108

 

---------------------------------------------------------------------------------

6.20更新

今天我用Arrays.parallelSort方法測試了一下,發現在使用包裝類數組Integer[]的情況下比正常的Arrays.sort慢,在使用基本類型int[]的情況下,同樣超時,與預想結果不同,先記錄下這個問題,暫時還沒時間細究。


免責聲明!

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



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