各種內部排序演算法的比較和選擇
各種內部排序演算法比較和選擇
演算法的簡單性
第一類是簡單演算法,包括直接插入排序、簡單選擇排序和起泡排序,這些演算法都比較簡單和直接,易於理解。第二類演算法是改進後的演算法,包括折半插入排序、希爾排序、錦標賽排序、堆排序、快速排序和歸併排序(歸併排序可看作為對直接插入排序的另一種改進,它把記錄分組排序,但分組的方法同希爾排序不同;另外,它把記錄的插入和移動改為向另一個數組的複製),這些演算法都比較複雜。第三類是基數排序,它不是基於排序碼比較進行排序,而是另闢蹊徑,通過一系列分配和收集來排序。
演算法的效能分析
圖示
時間複雜度
就平均情況而言,直接插入排序、簡單選擇排序和起泡排序屬於第一類,其時間複雜度為
若從最好的情況考慮,則直接插入排序和起泡排序的時間複雜度最好,為
若從最壞的情況考慮,則快速排序的時間複雜度為
若再考慮各種排序演算法的時間複雜度的係數,則在第一類演算法中,直接插入排序的係數最小,簡單選擇排序次之(但它的移動次數最小),起泡排序最大,所以直接插入排序和簡單選擇排序比起泡排序速度快;在第二類演算法中,快速排序的係數最小,堆排序和歸併排序次之,所以快速排序比堆排序和歸併排序速度快。
由此可知,在最好的情況下,直接插入排序和起泡排序最快;在平均的情況下,快速排序最快;在最壞的情況下,錦標賽排序、堆排序、歸併排序最快。
空間複雜度
第一類包括錦標賽排序排序和歸併排序,其空間複雜度為
演算法的穩定性
第一類是穩定的排序演算法,包括直接插入排序,折半插入排序,起泡排序,歸併排序,錦標賽排序和基數排序。第二類是不穩定的排序演算法,包括希爾排序,簡單選擇排序,快速排序和堆排序。
適用問題的規模
設待排序元素序列的元素個數(問題規模)為n,則n越小,採用簡單排序方法越合適;n越大,採用改進排序演算法越合適。因為n越小,
元素本身的資訊量
元素本身的資訊量越大,表明佔用的儲存數量就越多,移動元素時所花費的時間就越多,所以對元素移動次數越多的演算法不利。例如,在三中簡單排序演算法中,簡單選擇排序移動記錄的次數為
結論
- 當倒排序元素個數n較大,且排序碼分佈較隨機,對穩定性不做要求時,採用快速排序為宜。
- 當待排序元素個數n較大,記憶體空間允許,且要求排序結果穩定,採用歸併排序或者錦標賽排序。
- 當待排序元素個數n較大,排序碼分佈可能會出現正序或者逆序的情況,且對穩定性不作要求時,則採用堆排序(或者歸併排序)演算法。
- 當待排序元素個數n較少,元素的初始排列基本有序(即正序)或者分佈較隨機,且要求穩定時,採用直接插入排序為宜。
- 當待排序元素個數n較小,對穩定性不做要求時,則採用簡單選擇排序為宜,若排序碼不接近逆序,亦可以採用直接插入排序。
注:本文內容來自書籍《資料結構精講與習題詳解—考研輔導與答疑解惑》,殷人昆編著,清華大學出版社。僅供學習用