總的來說,java中Arrays.sort使用了兩種排序方法,快速排序和優化的合並排序。Collections.sort方法底層就是調用的Arrays.sort方法。
快速排序主要是對那些基本類型數據(int,short,long等)排序,而歸並排序用於對Object類型進行排序。
使用不同類型的排序算法主要是由於快速排序是不穩定的,而歸並排序是穩定的。這里的穩定是指比較相等的數據在排序之后仍然按照排序之前的前后順序排列。對於基本數據類型,穩定性沒有意義,而對於Object類型,穩定性是比較重要的,因為對象相等的判斷可能只是判斷關鍵屬性,最好保持相等對象的非關鍵屬性的順序與排序前一致;另外一個原因是由於歸並排序相對而言比較次數比快速排序少,移動(對象引用的移動)次數比快速排序多,而對於對象來說,比較一般比移動耗時。
此外,對大數組排序。快速排序的sort()采用遞歸實現,數組規模太大時會發生堆棧溢出,而歸並排序sort()采用非遞歸實現,不存在此問題。
總結:
首先先判斷需要排序的數據量是否大於47。
小於47:使用插入排序,插入排序是穩定的
大於47的數據量會根據數據類型選擇排序方式:
基本類型:使用調優的快速排序(雙軸快速排序)。
Object類型:使用改進的歸並排序。因為歸並排序具有穩定性。
注意:不管是快速排序還是歸並排序。在二分的時候小於47的數據量依舊會使用插入排序。