今天總結一下各種常見的排序演算法的時間效能、空間效能以及適用的場景。
排序法平均時間
最壞時間
最好時間
穩定性額外空間
備註冒泡法
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。第一次交換後會...