1. 程式人生 > >快速排序演算法在平均情況下的時間複雜度為 求詳解

快速排序演算法在平均情況下的時間複雜度為 求詳解

時間複雜度為O(nlogn) n為元素個數
1. 快速排序的三個步驟:
1.1. 找到序列中用於劃分序列的元素
1.2. 用元素劃分序列
1.3. 對劃分後的兩個序列重複1,2兩個步驟指導序列無法再劃分
所以對於n個元素其排序時間為 
   T(n) = 2*T(n/2) + n (表示將長度為n的序列劃分為兩個子序列,每個子序列需要T(n/2)
                         的時間,而劃分序列需要n的時間)
而 T(1) = 1            (表示長度為1的序列無法劃分子序列,只需要1的時間即可) 
   T(n) = 2^logn + logn * n   (n被不斷二分最終只能二分logn次(最優的情況,每次選取
                                的元素都均分序列))
        = n + nlogn
因此T(n) = O(nlogn)
以上是最優情況的推導,因此快速排序在最優情況下其排序時間為O(nlogn),通常平均情況
我們也認為是此值。
在最壞情況下其會退化為氣泡排序,T(n) = T(n - 1) + n (每次選取的元素只能將序列劃分為
一段,即自身是 最小元素或最大元素)
              因此T(n) = n * (n-1) / 2 相當於O(n^2)
追問
n被不斷二分最終只能二分logn次 什麼意思?
追答
在最優的情況下,即每次二分序列時都將序列平均的分為兩部分,此時n被不斷二分最終只能二分logn次。

即起始為n,第一次分為兩個n/2,第二次分為四個n/4...第m次分為2^m個1,
意思就是在最優的情況下對n進行二分時最多二分m次即會出現2^m個全為1的序列。
所以此時2^m * 1 = n 因此顯然m=logn。
推倒方式如下:
T(n) = 2*T(n/2) + n

T(n) = 2 * (2 * T(n/4) + n/2) + n
......
T(n) = 2^mT(1) + mn
其中m即等於logn,所以T(n) = nT(1) + nlogn = n + nlogn