各種排序演算法效能之間的比較

2021-07-04 00:19:33 字數 1657 閱讀 8994

今天總結一下各種常見的排序演算法的時間效能、空間效能以及適用的場景。

排序法平均時間

最壞時間

最好時間

穩定性額外空間

備註冒泡法

o(n*n)

o(n*n)

o(n)

穩定o(1)

n小時較好(演算法比較簡單)

插入法o(n*n)

o(n*n)

o(n)

穩定o(1)

大部分已排序時較好

直接選擇

o(n*n)

o(n*n)

o(n*n)

不穩定o(1)

n小時較好(演算法比較簡單)

快排o(n*logn)

o(n*n)

o(n*logn)

不穩定o(logn)

n大時較好,基本有序時反而不好

堆排序o(n*logn)

o(n*logn)

o(n*logn)

不穩定o(1)

n大時較好

歸併排序

o(n*logn)

o(n*logn)

o(n*logn)

穩定o(n)

n大時較好

希爾排序

o(n*logn)

o(n*logn)

與步長相關

不穩定o(1)

n小時較好(演算法較複雜)

桶排序o(n)

o(n)

o(n)

穩定不確定,與元素

範圍大小有關

基數排序

o(logrb)

o(logrb)

o(logrb)

穩定o(n)

b是真數(0-9),r是基數(個十百)

對於時間複雜度為o(nlogn)的演算法,常見的有快排、堆排序以及歸併排序。其中,快排的時間效率最高,但是在資料本身基本有序的時候反而不好,時間效能比較不穩定。而堆排序是乙個穩定的o(nlogn)演算法,但是在一般情況下要比快排的效率低。因此在強調時間效能的穩定性的時候可以採用堆排序。快速排序的空間複雜度體現在棧的深度,而歸併排序的空間複雜度體現在演算法執行中一直維持著o(n)的輔助空間。

希爾排序比氣泡排序快5倍,比插入排序大致快2倍。希爾排序比起quicksort,mergesort,heapsort慢很多。但是它相對比較簡單,它適合於資料量在5000以下並且速度並不是特別重要的場合。它對於資料量較小的數列重複排序是非常好的。

上面所述的這些排序都是基於元素之間的比較進行的,不能突破o(n*logn)的時間複雜度。桶排序和基數排序都是非基於比較的排序,因此可以打破o(n*logn)的時間限制,但是資料元素相對於基於比較的排序方法是受到限制的,例如元素的大小範圍是限定的。

桶排序是常見的排序中最快的,但是空間消耗非常大,而且只適合於數值區間確定的整數。個人感覺有點像是把數值作為鍵值的乙個最簡單的hash表。

基數排序是一種對多元組排序的有效方法,具體實現要用到計數排序或桶排序。

相對於快速排序、堆排序等基於比較的排序演算法,計數排序、桶排序和基數排序限制較多,不如快速排序、堆排序等演算法靈活性好。但反過來講,這三種線性排序演算法之所以能夠達到線性時間,是因為充分利用了待排序資料的特性,如果生硬得使用快速排序、堆排序等演算法,就相當於浪費了這些特性,因而達不到更高的效率。

線性排序演算法使用最重要的是,

充分利用資料特殊的性質,以達到最佳效果。

各種內排序演算法效能比較

各種內排序演算法效能比較 個人總結 穩定性最好情況 最壞情況 平均空間複雜度 確定最終位置 簡單選擇排序 屬於選擇排序 不穩定o n n 1趟 o n n 1趟 o n n 1趟 o 1 一趟排序後能確定某個元素的最終位置 直接插入排序 穩定o n n 1趟 o n n 1趟 反向有序 o n n ...

各種排序演算法比較

花了很長時間終於把排序的基礎學了一下,這段時間學了很多東西,總結一下 學的排序演算法有 插入排序,合併排序,氣泡排序,選擇排序,希爾排序,堆排序,快速排序,計數排序,基數排序,桶排序 沒有實現 比較一下學習後的心得。我不是很清楚他們的時間複雜度,也真的不知道他們到底誰快誰慢,因為書上的推導我確實只是...

各種排序演算法比較

排序相關的演算法複雜度分析 下邊分別實現下各個演算法 簡單選擇排序 1 簡單選擇排序 2void select sort int a,intn 3 16 17swap a i a index 18 19 這裡簡單選擇排序之所以不穩定是因為交換的時候會打亂順序,例如 5,4,5,1,6。第一次交換後會...