一、排序的分類
1、根據待排序的數據大小不同,使得排序過程中所涉及的存儲器不同,可分為: 內部排序(內存即夠,以下十個算法均為內部排序) 、外部排序 (還需訪問外存)
2、排序關鍵字可能出現重復,根據重復關鍵字的排序情況可分為: 穩定排序(排序后重復關鍵字記錄的相對次序保持不變) 、不穩定排序
3、對於內部排序,依據不同的排序原則,可分為: 插入排序、交換(快速)排序 、選擇排序 、歸並排序 、計數排序
4、針對內部排序所需的工作量划分,可分為: 簡單排序 O(n^2) 、先進排序 O(nlogn) 、基數排序 O(d*n)
二、排序細分
1、插入排序 :直接插入排序 、2-路插入排序 、希爾排序
2、交換(快速)排序 :冒泡排序 、快速排序(快排)
3、選擇排序 :簡單選擇排序 、樹形選擇排序 、堆排序
4、簡單排序 :直接插入排序 、Shell排序 、直接選擇排序 、冒泡排序 、快速排序
5、先進排序 :堆排序 、歸並排序
三、外部排序
1、多路平衡歸並排序
2、置換-選擇排序
3、最佳歸並樹形排序
四、排序算法的選擇
每種排序算法都各有優缺點。因此,在實用時需根據不同情況適當選用,甚至可以將多種方法結合起來使用。
影響排序的因素有很多,平均時間復雜度低的算法並不一定就是最優的。相反,有時平均時間復雜度高的算法可能更適合某些特殊情況。同時,選擇算法時還得考慮它的可讀性,以利於軟件的維護。一般而言,需要考慮的因素有以下四點:
1、待排序的記錄數目n的大小;
2、記錄本身數據量的大小,也就是記錄中除關鍵字外的其他信息量的大小;
3、關鍵字的結構及其分布情況;
4、對排序穩定性的要求。
設待排序元素的個數為n:
1)當n較大,則應采用時間復雜度為O(nlog2n)的排序方法: 快速排序、堆排序或歸並排序序。
-
快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短。
-
堆排序 : 內存空間允許且要求穩定性的。
-
歸並排序:它有一定數量的數據移動,所以可通過與插入排序組合,先獲得一定長度的序列,然后再合並,在效率上將有所提高。
2)當n較大,內存空間允許,且要求穩定性:歸並排序 。
3)當n較小,可采用直接插入或直接選擇排序。
-
直接插入排序:當元素分布有序,直接插入排序將大大減少比較次數和移動記錄的次數。
-
直接選擇排序 :元素分布有序,如果不要求穩定性,選擇直接選擇排序 。
4)一般不使用或不直接使用傳統的冒泡排序。
5)基數排序 ,它是一種穩定的排序算法,但有一定的局限性:
-
關鍵字可分解。
-
記錄的關鍵字位數較少,如果密集更好 。
-
如果是數字時,最好是無符號的,否則將增加相應的映射復雜度,可先將其正負分開排序。