1. 程式人生 > >堆排序與快排比較

堆排序與快排比較

昨天做騰訊的筆試題中有一道選擇題,問幾種排序的最壞情況,快排,冒泡大家肯定都知道是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小時好
2、最壞情況是把順序的排列變成逆序,或者把逆序的數列變成順序,最差時間複雜度O(N^2)只是表示其操作次數的數量級
3、最好的情況是資料本來就有序,複雜度為O(n)

快速排序

O(N*log2N)

O(N*log2N) 

O(N2)

O(log2n)~O(n) 

不穩定

複雜

1、n大時好,快速排序比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高不穩定的排序演算法。
2、劃分之後一邊是一個,一邊是n-1個,
這種極端情況的時間複雜度就是O(N^2)
3、最好的情況是每次都能均勻的劃分序列,O(N*log2N)

歸併排序

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個這種問題,構建一個小頂堆然後遍歷調整就可以了

為什麼是小頂堆:小頂堆,最小的數就在最上面,只要與最上面的數進行比較就可以了,所以是小頂