九種常見排序的比較和實現

首先排序算法大的可以分爲:

  1. 關鍵字比較
  2. 非關鍵字比較

關鍵字比較

關鍵字比較就是通過關鍵字之間的比較和移動,從而使整個序列有序,
而關鍵字比較的算法,又可以像下面這樣劃分:

這裏寫圖片描述

對於排序算法之間的比較,無異於時間複雜度和空間複雜度,看下面這張表格
這裏寫圖片描述

由上表不難得出下面這幾個重要的點:

  1. 從平均時間性能而言,快速排序最佳,其所需時間最佳,但快速排序在最壞情況下的時間性能不如堆排序和歸併排序。堆排序和歸併之間,當n較大時,歸併排序所需時間省,但是所需的輔助空間卻是最大的,堆本身不是專門爲排序產生的,而是解決優先級隊列和TopK問題。
  2. 幾種簡單排序中,除了希爾排序外的所有插入排序,冒泡排序,和選擇排序中,直接插入排序最爲簡單,並且當序列接近有序時或N值較小時,時間複雜度可以達到O(N),因此在快速排序和歸併排序中都用的高了直接插入排序。
  3. 從算法的穩定性而言,性能較好的幾種排序算法都是不穩定的,什麼叫穩定性,就是原序列中有相同的數,排完序後不改變其相對位置。

非比較型

這裏寫圖片描述

計數排序:
計數排序:時間複雜度:O(N), 空間複雜度O(最大數-最小數)
基數排序:時間複雜度:O(N*位數),空間輔助度O(N)

計數排序和基數排序都是用與比較數之間較爲幾種的情況,計數排序關注最大數和最小數之間的區間大小,基數排序關注最大數的位數。

綜上,沒有那個算法是最好的,都要視具體的使用場景來看,不過綜合而言快速排序是在實際中用的比較多的,比如c++ STL庫中的sort()函數,底層就是快速排序。

最後再提一下穩定性問題,一般來說,排序過程中“比較”是在“相鄰兩個關鍵字”之間進行的排序方法都是穩定的。具體應用的,由於大多數情況下排序是按記錄的主關鍵字進行的,則所需算法的穩定性就無關緊要了,但若是按記錄的次關鍵字進行,這時候就要慎重選擇排序算法了。


視覺感受各算法:http://blog.jobbole.com/11745/
下面是我自己總結的幾種排序算法以及實現代碼:

  1. 直接插入排序:http://blog.csdn.net/qq_36528114/article/details/78186355
  2. 希爾排序:http://blog.csdn.net/qq_36528114/article/details/78659733
  3. 選擇排序:http://blog.csdn.net/qq_36528114/article/details/78664041
  4. 冒泡排序:http://blog.csdn.net/qq_36528114/article/details/78684806
  5. 快速排序:http://blog.csdn.net/qq_36528114/article/details/78667034
  6. 堆排序:http://blog.csdn.net/qq_36528114/article/details/78674405
  7. 歸併排序:http://blog.csdn.net/qq_36528114/article/details/78674929
  8. 計數排序:http://blog.csdn.net/qq_36528114/article/details/78676960
  9. 基數排序:http://blog.csdn.net/qq_36528114/article/details/78683623

所有代碼實現:https://github.com/treasureb/Datastruct/tree/master/Sort

如果有不對的地方,還望及時指正,謝謝!

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