堆排序與快排比較
昨天做騰訊的筆試題中有一道選擇題,問幾種排序的最壞情況,快排,冒泡大家肯定都知道是n^2,當時選項中有一個堆排序,不是很確定,下來就把這些收集了一下
表格轉自http://www.cnblogs.com/xiaochun126/p/5086037.html
之後就重點說一下堆排序和快排的選擇問題
各種常用排序演算法 |
||||||||
類別 |
排序方法 |
時間複雜度 |
空間複雜度 |
穩定性 |
複雜性 |
特點 |
||
最好 |
平均 |
最壞 |
輔助儲存 |
|
簡單 |
|
||
插入 排序 |
直接插入 |
O(N) |
O(N2) |
O(N2) |
O(1) |
穩定 |
簡單 |
|
希爾排序 |
O(N) |
O(N1.3) |
O(N2) |
O(1) |
不穩定 |
複雜 |
|
|
選擇 排序 |
直接選擇 |
O(N) |
O(N2) |
O(N2) |
O(1) |
不穩定 |
|
|
堆排序 |
O(N*log2N) |
O(N*log2N) |
O(N*log2N) |
O(1) |
不穩定 |
複雜 |
|
|
交換 排序 |
氣泡排序 |
O(N) |
O(N2) |
O(N2) |
O(1) |
穩定 |
簡單 |
1、氣泡排序是一種用時間換空間的排序方法,n小時好 |
快速排序 |
O(N*log2N) |
O(N*log2N) |
O(N2) |
O(log2n)~O(n) |
不穩定 |
複雜 |
1、n大時好,快速排序比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高不穩定的排序演算法。 |
|
歸併排序 |
O(N*log2N) |
O(N*log2N) |
O(N*log2N) |
O(n) |
穩定 |
複雜 |
1、n大時好,歸併比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高且穩定的排序演算法。 |
|
基數排序 |
O(d(r+n)) |
O(d(r+n)) |
O(d(r+n)) |
O(rd+n) |
穩定 |
複雜 |
|
|
注:r代表關鍵字基數,d代表長度,n代表關鍵字個數 大家可以看到,堆排序的時間複雜度是很穩定的,而快排的時間複雜度最壞情況下會到n^2,那麼為什麼不都用堆排序呢? 首先,時間複雜度這個概念只是一個粗略的估計概念,在真實情況下, 一般快排的效率比堆排序高很多。 快排:陣列中交換資料,在資料量不是特別大,而且離散程度較高的情況下效率很高 堆排序:建立堆,資料交換,調整堆的時間均很多 所以在實際應用中,我們用快排會更多一點。 堆排序的典型應用:在100萬個數字中找出最大的100個這種問題,構建一個小頂堆然後遍歷調整就可以了 為什麼是小頂堆:小頂堆,最小的數就在最上面,只要與最上面的數進行比較就可以了,所以是小頂 |