爲什麼java默認的排序算法採用歸併排序Timsort

java排序的過程描述

1、N<47 插入排序
2、47<N<286 雙軸快排
3、286<N 連續性好 歸併排序(Timsort)
4、286<N 連續性不好 雙軸快排
雙軸快速排序是對普通快速排序的優化
TimSort 算法實際上是對歸併排序的一系列優化
從上面我們知道在排序節點在大於286時,切連續性好的情況下采用Timsort(歸併排序)
我們知道歸併排序有個非常大的問題:時間複雜度是O(n),那爲什麼還採用歸併排序呢?

各種排序的時間複雜度與空間複雜度

 

 

 

 

 

 java排序爲什麼採用歸併排序

1、首先當排序數量大於286且連續性好(有序情況好)的時候纔會採用Timsort,連續性不好還會使用雙軸快排
2、如果連續性好的情況下用別管怎麼選擇分區點,快排時間複雜度都可能退化O(n²),所以這種情況要避免使用快排
3、Timsort就是針對這種連續性好的情況針對歸併排序的優化,優化的方向如下:
    1、Timsort是穩定的算法,當前排序的數組中已經有排序好的數,它的時間複雜度會小於O(nlogn)
    2、最壞情況下Timsort算法需要的臨時空間是n/2,在最好情況下,它只需要一個很小的臨時存儲空間

參考文檔:https://www.jianshu.com/p/892ebd063ad9

 
 
 
 
 
 
 
 
 
 
 

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