首先排序演算法大的可以分為:
關鍵字比較
非關鍵字比較
關鍵字比較就是通過關鍵字之間的比較和移動,從而使整個序列有序,
而關鍵字比較的演算法,又可以像下面這樣劃分:
對於排序演算法之間的比較,無異於時間複雜度和空間複雜度,看下面這張**
由上表不難得出下面這幾個重要的點:
從平均時間效能而言,快速排序最佳,其所需時間最佳,但快速排序在最壞情況下的時間效能不如堆排序和歸併排序。堆排序和歸併之間,當n較大時,歸併排序所需時間省,但是所需的輔助空間卻是最大的,堆本身不是專門為排序產生的,而是解決優先順序佇列和topk問題。
幾種簡單排序中,除了希爾排序外的所有插入排序,氣泡排序,和選擇排序中,直接插入排序最為簡單,並且當序列接近有序時或n值較小時,時間複雜度可以達到o(n),因此在快速排序和歸併排序中都用的高了直接插入排序。
從演算法的穩定性而言,效能較好的幾種排序演算法都是不穩定的,什麼叫穩定性,就是原序列中有相同的數,排完序後不改變其相對位置。
計數排序:
計數排序:時間複雜度:o(n), 空間複雜度o(最大數-最小數)
基數排序:時間複雜度:o(n*位數),空間輔助度o(n)
計數排序和基數排序都是用與比較數之間較為幾種的情況,計數排序關注最大數和最小數之間的區間大小,基數排序關注最大數的位數。
綜上,沒有那個演算法是最好的,都要視具體的使用場景來看,不過綜合而言快速排序是在實際中用的比較多的,比如c++ stl庫中的sort()函式,底層就是快速排序。
最後再提一下穩定性問題,一般來說,排序過程中「比較」是在「相鄰兩個關鍵字」之間進行的排序方法都是穩定的。具體應用的,由於大多數情況下排序是按記錄的主關鍵字進行的,則所需演算法的穩定性就無關緊要了,但若是按記錄的次關鍵字進行,這時候就要慎重選擇排序演算法了。
視覺感受各演算法:
下面是我自己總結的幾種排序演算法以及實現**:
直接插入排序:
希爾排序:
選擇排序:
氣泡排序:
快速排序:
堆排序:
歸併排序:
計數排序:
基數排序:
所有**實現:
如果有不對的地方,還望及時指正,謝謝!
php實現7種常見排序
class test public function createdata sectime microtime this gettimelimit firtime,sectime return data 歸併排序開始 public function mergesort data public fun...
9種常見內部排序演算法的效能比較
在寫完這9種常見的內部排序演算法後總覺得需要把它們拿出來好好比較一番,看看各個演算法的效能優劣。我們先來看看這九種排序演算法的時間複雜度 空間複雜度和穩定性 看完了各個排序演算法的理論效能後,再來看一看在實踐上的效能。在程式裡,隨機數的範圍為0 49999999 進行10次外迴圈,每一趟外迴圈裡生成...
常見排序的思想和實現
所謂排序,就是要整理檔案中的記錄,使之按關鍵字遞增 或遞減 次序排列起來。當待排序記錄的關鍵字都不相同時,排序結果是惟一的,否則排序結果不惟一。在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對...