各種內部排序算法的比較和選擇

各種內部排序算法比較和選擇

算法的簡單性

第一類是簡單算法,包括直接插入排序、簡單選擇排序和起泡排序,這些算法都比較簡單和直接,易於理解。第二類算法是改進後的算法,包括折半插入排序、希爾排序、錦標賽排序、堆排序、快速排序和歸併排序(歸併排序可看作爲對直接插入排序的另一種改進,它把記錄分組排序,但分組的方法同希爾排序不同;另外,它把記錄的插入和移動改爲向另一個數組的複製),這些算法都比較複雜。第三類是基數排序,它不是基於排序碼比較進行排序,而是另闢蹊徑,通過一系列分配和收集來排序。

算法的性能分析

圖示


各種排序算法的性能比較
圖片來自:http://blog.chinaunix.net/uid-21457204-id-3060260.html

時間複雜度

就平均情況而言,直接插入排序、簡單選擇排序和起泡排序屬於第一類,其時間複雜度爲O(n2) ;折半插入排序、堆排序、錦標賽排序、快速排序和歸併排序屬於第二類,其時間複雜度爲O(nlog2n) ;希爾排序介於這兩者之間。
若從最好的情況考慮,則直接插入排序和起泡排序的時間複雜度最好,爲O(n) ,其他算法的最好情況同平均情況相同。
若從最壞的情況考慮,則快速排序的時間複雜度爲O(n) ,直接插入排序、希爾排序和起泡排序雖然同平均情況下相同,但是係數大約增加一倍,所以運行速度降低一半,最壞情況對簡單選擇排序(僅指比較次數)、錦標賽排序、堆排序、和歸併排序影響不大。
若再考慮各種排序算法的時間複雜度的係數,則在第一類算法中,直接插入排序的係數最小,簡單選擇排序次之(但它的移動次數最小),起泡排序最大,所以直接插入排序和簡單選擇排序比起泡排序速度快;在第二類算法中,快速排序的係數最小,堆排序和歸併排序次之,所以快速排序比堆排序和歸併排序速度快。
由此可知,在最好的情況下,直接插入排序和起泡排序最快;在平均的情況下,快速排序最快;在最壞的情況下,錦標賽排序、堆排序、歸併排序最快。

空間複雜度

第一類包括錦標賽排序排序和歸併排序,其空間複雜度爲O(n) 。第二類是快速排序,其空間複雜度爲O(log2n) 。第三類包括其它算法,其空間複雜度爲O(1) 。由此可知,第三類算法的空間複雜度最好,第二類次之,第一類最差。

算法的穩定性

第一類是穩定的排序算法,包括直接插入排序,折半插入排序,起泡排序,歸併排序,錦標賽排序和基數排序。第二類是不穩定的排序算法,包括希爾排序,簡單選擇排序,快速排序和堆排序。

適用問題的規模

設待排序元素序列的元素個數(問題規模)爲n,則n越小,採用簡單排序方法越合適;n越大,採用改進排序算法越合適。因爲n越小,n2nlog2n 的差距越小;而n越大,n2nlog2n 的差距就越大。

元素本身的信息量

元素本身的信息量越大,表明佔用的存儲數量就越多,移動元素時所花費的時間就越多,所以對元素移動次數越多的算法不利。例如,在三中簡單排序算法中,簡單選擇排序移動記錄的次數爲O(n) ,其它兩種爲O(n2) ,所以當元素本身的信息量較大的時候,對簡單選擇排序算法有利,而對其它兩種算法不利。

結論

  1. 當倒排序元素個數n較大,且排序碼分佈較隨機,對穩定性不做要求時,採用快速排序爲宜。
  2. 當待排序元素個數n較大,內存空間允許,且要求排序結果穩定,採用歸併排序或者錦標賽排序。
  3. 當待排序元素個數n較大,排序碼分佈可能會出現正序或者逆序的情況,且對穩定性不作要求時,則採用堆排序(或者歸併排序)算法。
  4. 當待排序元素個數n較少,元素的初始排列基本有序(即正序)或者分佈較隨機,且要求穩定時,採用直接插入排序爲宜。
  5. 當待排序元素個數n較小,對穩定性不做要求時,則採用簡單選擇排序爲宜,若排序碼不接近逆序,亦可以採用直接插入排序。

注:本文內容來自書籍《數據結構精講與習題詳解—考研輔導與答疑解惑》,殷人昆編著,清華大學出版社。僅供學習用

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