首先排序算法大的可以分爲:
- 關鍵字比較
- 非關鍵字比較
關鍵字比較
關鍵字比較就是通過關鍵字之間的比較和移動,從而使整個序列有序,
而關鍵字比較的算法,又可以像下面這樣劃分:
對於排序算法之間的比較,無異於時間複雜度和空間複雜度,看下面這張表格
由上表不難得出下面這幾個重要的點:
- 從平均時間性能而言,快速排序最佳,其所需時間最佳,但快速排序在最壞情況下的時間性能不如堆排序和歸併排序。堆排序和歸併之間,當n較大時,歸併排序所需時間省,但是所需的輔助空間卻是最大的,堆本身不是專門爲排序產生的,而是解決優先級隊列和TopK問題。
- 幾種簡單排序中,除了希爾排序外的所有插入排序,冒泡排序,和選擇排序中,直接插入排序最爲簡單,並且當序列接近有序時或N值較小時,時間複雜度可以達到O(N),因此在快速排序和歸併排序中都用的高了直接插入排序。
- 從算法的穩定性而言,性能較好的幾種排序算法都是不穩定的,什麼叫穩定性,就是原序列中有相同的數,排完序後不改變其相對位置。
非比較型
計數排序:
計數排序:時間複雜度:O(N), 空間複雜度O(最大數-最小數)
基數排序:時間複雜度:O(N*位數),空間輔助度O(N)
計數排序和基數排序都是用與比較數之間較爲幾種的情況,計數排序關注最大數和最小數之間的區間大小,基數排序關注最大數的位數。
綜上,沒有那個算法是最好的,都要視具體的使用場景來看,不過綜合而言快速排序是在實際中用的比較多的,比如c++ STL庫中的sort()函數,底層就是快速排序。
最後再提一下穩定性問題,一般來說,排序過程中“比較”是在“相鄰兩個關鍵字”之間進行的排序方法都是穩定的。具體應用的,由於大多數情況下排序是按記錄的主關鍵字進行的,則所需算法的穩定性就無關緊要了,但若是按記錄的次關鍵字進行,這時候就要慎重選擇排序算法了。
視覺感受各算法:http://blog.jobbole.com/11745/
下面是我自己總結的幾種排序算法以及實現代碼:
- 直接插入排序:http://blog.csdn.net/qq_36528114/article/details/78186355
- 希爾排序:http://blog.csdn.net/qq_36528114/article/details/78659733
- 選擇排序:http://blog.csdn.net/qq_36528114/article/details/78664041
- 冒泡排序:http://blog.csdn.net/qq_36528114/article/details/78684806
- 快速排序:http://blog.csdn.net/qq_36528114/article/details/78667034
- 堆排序:http://blog.csdn.net/qq_36528114/article/details/78674405
- 歸併排序:http://blog.csdn.net/qq_36528114/article/details/78674929
- 計數排序:http://blog.csdn.net/qq_36528114/article/details/78676960
- 基數排序:http://blog.csdn.net/qq_36528114/article/details/78683623
所有代碼實現:https://github.com/treasureb/Datastruct/tree/master/Sort
如果有不對的地方,還望及時指正,謝謝!