穩定性:若是一個排序算法可以保留數組中重複元素的相對位置則能夠被稱爲是穩定的。例如,一組數據先按照時間排序,再按照地理位置排序。若是第二次排序的排序算法具備穩定性,那麼相同地理位置的數據仍是按照時間排序的。java
只有插入排序、冒泡排序和歸併排序是穩定的。程序員
各類排序算法的性能特色:算法
算法 | 是否穩定 | 是否爲原地排序 | 時間複雜度 | 空間複雜度 | 備註 |
選擇排序 | 否 | 是 | N² | 1 | |
冒泡排序 | 是 | 是 | 介於N和N²之間 | 1 | |
插入排序 | 是 | 是 | 介於N和N²之間 | 1 | 取決於輸入元素的排列狀況 |
希爾排序 | 否 | 是 | 近似於NlogN | 1 | |
快速排序 | 否 | 是 | NlogN | lgN | 運行效率由機率提供保證 |
三向快速排序 | 否 | 是 | 介於N和NlogN之間 | lgN | 運行效率由機率保證,同時也取決於輸入元素的分佈狀況 |
歸併排序 | 是 | 否 | NlogN | N | |
堆排序 | 否 | 是 | NlogN | 1 |
應用選擇:數組
①大多數實際狀況中,快速排序是最佳選擇;可是若是穩定性很重要,而空間又不是問題,歸併排序多是最好的。less
②將原始數據類型排序:一些性能優先的應用的重點多是將數字排序,所以更合理的作法是跳過引用在直接將原始數據類型排序。例如,將double類型的數組和Double類型的數組排序有很大差異,前者能夠直接交換這些數,然後者咱們交換的是存儲了這些數字的Double對象的引用。具體方法是把Comparable藉口替換爲原始數據類型名,重定義less()方法或者乾脆將調用less方法的地方替換爲a[i]<a[j]這樣的代碼。性能
Java系統庫的排序算法:spa
Java系統庫中的主要排序方法java.util.Arrays.sort()。根據不一樣的參數leixing,他實際上表明瞭一系列的排序方法。對象
①每種原始數據類型都有一個不一樣的排序方法;排序
②一個適用於全部實現了Comparable接口的數據類型的排序算法;接口
③一個適用於實現了比較器Comparable的數據類型的排序算法。
Java程序員算着對原始數據類型使用(三向切分的)快速排序;對引用類型使用歸併排序(穩定性)。