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

2021-08-11 14:49:21 字數 1295 閱讀 6856

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

關鍵字比較

非關鍵字比較

關鍵字比較就是通過關鍵字之間的比較和移動,從而使整個序列有序,

而關鍵字比較的演算法,又可以像下面這樣劃分:

對於排序演算法之間的比較,無異於時間複雜度和空間複雜度,看下面這張**

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

從平均時間效能而言,快速排序最佳,其所需時間最佳,但快速排序在最壞情況下的時間效能不如堆排序和歸併排序。堆排序和歸併之間,當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次外迴圈,每一趟外迴圈裡生成...

常見排序的思想和實現

所謂排序,就是要整理檔案中的記錄,使之按關鍵字遞增 或遞減 次序排列起來。當待排序記錄的關鍵字都不相同時,排序結果是惟一的,否則排序結果不惟一。在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對...