各種排序演算法的時間複雜度

2021-09-24 03:43:13 字數 3272 閱讀 6816

當我們評價乙個演算法的時間效能時,主要標準就是演算法的漸近時間複雜度,在演算法分析時,經常是將漸近時間複雜度t(n)=o(f(n))簡稱為時間複雜度,其中的f(n)一般是演算法中頻度最大的語句頻度。演算法中語句的頻度不僅與問題規模有關,還與輸入例項中各元素的取值相關。但是我們總是考慮在最壞的情況下的時間複雜度。以保證演算法的執行時間不會比它更長。

常見的時間複雜度,按數量級遞增排列依次為:常數階o(1)、對數階o(log2n)、線性階o(n)、線性對數階o(nlog2n)、平方階o(n^2)、立方階o(n^3)、k次方階o(n^k)、指數階o(2^n)。常見的演算法時間複雜度由小到大依次為:

c < log2n < n < n * log2n < n^2 < n^3 < 2^n < 3^n < n!

其中c是乙個常量,如果乙個演算法的複雜度為c 、 log2n 、n 、 n*log2n ,那麼這個演算法時間效率比較高 .

假設執行一行基礎**需要執行一次運算。

int afunc(void)
那麼上面這個方法需要執行 2 次運算

int afunc(int n) 

}此時時間複雜度為 o(n × 1),即 o(n)。

void afunc(int n) 

}}此時時間複雜度為 o(n × n × 1),即 o(n^2)。

void afunc(int n) 

}// 第二部分時間複雜度為 o(n)

for(int j = 0; j < n; j++)

}此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。

void afunc(int n) 

}} else

}}此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。

時間複雜度分析的基本策略是:從內向外分析,從最深層開始分析。如果遇到函式呼叫,要深入函式進行分析。求該方法的時間複雜度

void afunc(int n) 

}

參***:假設迴圈次數為 t,則迴圈條件滿足 2^t < n。可以得出,執行次數t = log(2)(n),即 t(n) = log(2)(n),可見時間複雜度為 o(log(2)(n)),即 o(log n)。

from :

氣泡排序:最好的情況是資料本來就有序,複雜度為o(n);最差的情況是o(

選擇排序:最好的情況是資料本來就有序,複雜度為o(n);最差的情況是o(

直接插入排序:最好的情況是資料本來就有序,複雜度為o(n);最差的情況是o(

希爾排序:最好的情況複雜度為o(n);最差的情況是o(

快速排序:最好的情況複雜度為nlogn,最差的情況是o(

最優情況:partition每次都劃分得很均勻,如果排序n個關鍵字,其遞迴樹的深度就為 [log2n]+1( [x] 表示不大於 x 的最大整數),即僅需遞迴 log2n 次,需要時間為t(n)的話,第一次partiation應該是需要對整個陣列掃瞄一遍,做n次比較。然後,獲得的樞軸將陣列一分為二,那麼各自還需要t(n/2)的時間(注意是最好情況,所以平分兩半)。於是不斷地劃分下去,就有了下面的不等式推斷:

歸併排序:所有情況下都是nlogn,穩定演算法。

總時間=分解時間+解決問題時間+合併時間。分解時間就是把乙個待排序序列分解成兩序列,時間複雜度o(1).解決問題時間是兩個遞迴式,把乙個規模為n的問題分成兩個規模分別為n/2的子問題,時間為2t(n/2).合併時間複雜度為o(n)。總時間t(n)=2t(n/2)+o(n).這個遞迴式可以用遞迴樹來解,用遞迴樹的方法解遞迴式t(n)=2t(n/2)+o(n):假設解決最後的子問題用時為常數c,則對於n個待排序記錄來說整個問題的規模為cn。

從這個遞迴樹可以看出,每一層代價都是cn,總共有logn+1層。所以總的時間代價為cn*(logn+1).時間複雜度是o(nlogn)

類別排序方法

時間複雜度

空間複雜度

穩定性複雜性

特點最好

平均最壞

輔助儲存

簡單插入

排序直接插入

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、氣泡排序是一種用時間換空間的排序方法

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代表關鍵字個數,「2」是底數,

from:

各種排序演算法時間複雜度

各種排序演算法比較 各種常用排序演算法 類別排序方法 時間複雜度 空間複雜度 穩定性複雜性 特點最好 平均最壞 輔助儲存 簡單插入 排序直接插入 o n o n2 o n2 o 1 穩定簡單 希爾排序 o n o n1.3 o n2 o 1 不穩定複雜 選擇排序 直接選擇 o n o n2 o n2...

各種排序演算法的時間複雜度

選擇排序 快速排序 希爾排序 堆排序不是穩定的排序演算法,氣泡排序 插入排序 歸併排序和基數排序是穩定的排序演算法。排序演算法不穩定的含義是 在排序之前,有兩個數相等.但是在排序結束之後,它們兩個有可能改變順序.比如說 在乙個待排序佇列中,a和b相等,且a排在b的前面,而排序之後,a排在了b的後面....

各種排序演算法的時間複雜度

各種常用排序演算法 類別排序方法 時間複雜度 空間複雜度 穩定性複雜性 特點最好 平均最壞 輔助儲存 簡單插入 排序直接插入 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 不穩定堆排...