排序的最低時間複雜度為什麼是O(nlogn)

2021-06-17 20:40:19 字數 2745 閱讀 1859

這個首先要明確一點,只用到比較的排序演算法最低時間複雜度是o(nlogn),而像桶排這樣的只需要o(r)(r為桶的大小)

為了證明只用到比較的排序演算法最低時間複雜度是o(nlogn),首先要引入決策樹。

首先決策樹是一顆二叉樹,每個節點表示元素之間一組可能的排序,它予以京進行的比較相一致,比較的結果是樹的邊。

先來說明一些二叉樹的性質,令t是深度為d的二叉樹,則t最多有2^片樹葉。

具有l片樹葉的二叉樹的深度至少是logl。

所以,對n個元素排序的決策樹必然有n!片樹葉(因為n個數有n!種不同的大小關係),所以決策樹的深度至少是log(n!),即至少需要log(n!)次比較。

而log(n!)=logn+log(n-1)+log(n-2)+...+log2+log1

>=logn+log(n-1)+log(n-2)+...+log(n/2)

>=(n/2)log(n/2)

>=(n/2)logn-n/2

=o(nlogn)

所以只用到比較的排序演算法最低時間複雜度是o(nlogn)。

對排序演算法計算時間的分析可以遵循若干種不同的準則,通常以排序過程所需要的演算法步數作為度量,有時也以排序過程中所作的鍵比較次數作為度量。特別是當作一次鍵比較需要較長時間,例如,當鍵是較長的字串時,常以鍵比較次數作為排序演算法計算時間複雜性的度量。當排序時需要移動記錄,且記錄都很大時,還應該考慮記錄的移動次數。究竟採用哪種度量方法比較合適要根據具體情況而定。在下面的討論中我們主要考慮用比較的次數作為複雜性的度量。

為了對有n個元素的線性表進行排序,至少必須掃瞄線性表一遍以獲取這n個元素的資訊,因此排序問題的計算複雜性下界為ω(n)。

如果我們對輸入的資料不做任何要求,我們所能獲得的唯一資訊就是各個元素的具體的值,我們僅能通過比較來確定輸入序列1,a2,..,an>的元素間次序。即給定兩個元素ai和aj,通過測試ai

j,ai≤aj

,ai=aj ,ai≥aj ,ai>aj 中的哪乙個成立來確定ai和aj間的相對次序。這樣的排序演算法稱為比較排序演算法。下面我們討論一下比較排序演算法在最壞情況下至少需要多少次比較,即比較排序演算法的最壞情況複雜性下界。

我們假設每次比較只測試ai≤aj ,如果ai≤aj 成立則ai排在aj 前面,否則ai排在aj 後面。任何乙個比較排序演算法可以描述為一串比較序列:

(ai,aj),(ak,al),..,(am,an),...

表示我們首先比較(ai,aj),然後比較(ak,al),...,比較(am,an),...,直到我們獲取了足夠的資訊可以確定所有元素的順序。顯而易見,如果我們對所有的元素兩兩進行一次比較的話(總共比較了cn

2次),就一定可以確定所有元素的順序。但是,如果我們運氣足夠好的話,我們可能不必對所有元素兩兩進行一次比較。比如說對於有三個元素a1,a2,a3的線性表進行排序,如果我們先比較a1和a2,得到a1≤a2;然後比較a2和a3,得到a2≤a3;則不必比較a1和a3,因為根據偏序集的傳遞性,必有a1≤a3;但是如果a2≥a3,我們還必須比較a1和a3才能確定a1和a3的相對位置。如果我們適當的安排比較的次序的話,也可以減少比較的次數。這樣我們可以用一棵二叉樹表示比較的順序,如下圖所示:

該樹的每乙個非葉節點表示一次比較,每一根樹枝表示一種比較結果,每乙個葉節點表示一種排列順序。這樣的一棵二叉樹叫做決策樹,它用樹枝表示了每次決策做出的選擇。如此我們可以將任何乙個比較排序演算法用一棵決策樹來表示。

請注意上圖只表明了對三個元素的一種比較演算法,這種比較演算法依次比較(a1,a2)(a2,a3)(a1,a3),一旦中間某步得到足夠的資訊就可以停止比較,但是當演算法執行完後(三次比較後),一定可以確定三個元素間的次序。因此我們有理由將演算法在最壞情況下的比較次數作為演算法複雜性的度量,對於本例該演算法在最壞情況下要進行c3

2=3次比較。

顯然,一棵決策樹中最高葉節點的高度就是該決策樹對應的演算法在最壞情況下所需的比較次數,而決策樹中最低葉節點的高度就是該決策樹對應的演算法在最好情況下所需的比較次數。

我們的問題就變為:對於任意一棵決策樹(任意一種比較排序演算法),它的最高的樹葉的高度是多少?這個高度就對應於比較排序演算法所需的最多比較次數(在運氣最壞的情況下);換句話說,對於任何乙個輸入,該演算法至少需要比較多少次就可以對元素進行排序。

我們發現,決策樹的每個葉節點對應乙個n個元素的排列,其中可能有重複的;但是由於決策樹表明了所有可能遇到的情況,因而n個元素的所有排列都在決策樹中出現過。n個元素共有n!種排列,即決策樹的葉節點數目至少為n!。又因為一棵高度為h的二叉樹(指二叉樹的最高樹葉高度為h)的葉節點數目最多為2h個(這時正好是滿二叉樹,即每個非葉節點都有兩個子節點),因此n!≤2h,得到h≥log(n!),其中log以2為底。根據stirling公式有n!>(n/e)n,於是h>nlogn-nloge,即h=ω(nlogn)。

這樣我們就證明了對於任意一種利用比較來確定元素間相對位置的排序演算法,其最壞情況下複雜性為ω(nlogn)。

在下文中我們將討論幾種比較排序演算法,其中快速排序在平均情況下複雜性為o(nlogn),最壞情況下複雜性為o(n2);堆排序和合併排序在最壞情況下複雜性為o(nlogn),因此堆排序和合併排序是漸進最優的比較排序演算法。

排序演算法是否還能夠改進呢?從前文我們知道,如果要改進排序演算法的效率,就不能只利用比較來確定元素間相對位置。因此我們還需要知道元素的其他附加資訊,光知道元素的大小資訊是不夠的。下文中我們介紹的計數排序,基數排序和桶排序是具有線性時間複雜性的排序演算法,這些演算法無一例外地對輸入資料作了某些附加限制,從而增加已知的資訊,因此可以不通過比較來確定元素間的相對位置。

氣泡排序最好時間複雜度為什麼是O n

通過上面的部落格我知道了 按照最初級的一般寫法,每一次迴圈都比較相鄰資料的大小,原資料是否有序不會影響比較次數,此時時間複雜度是o n 2 而網上和書上的很多說o n 是因為加了優化。初始didswap false.當發生一次交換就將didswap置為true,這樣如果原始有序,那麼一次掃瞄完一次交...

什麼是時間複雜度

什麼是時間複雜度 作為乙個處在學習之路的渣渣,被乙個時間複雜度的題給難倒了,然後我就思考了一下什麼是時間複雜度。雖然在學校學習了了演算法的課程,但是仔細一想,對於時間複雜度還真是不怎麼懂。於是重新學習,記下自己的一些理解。1.時間複雜度 提到時間複雜度,第一時間想到的是演算法,簡單說,演算法就是你解...

什麼是時間複雜度

什麼是時間複雜度 作為乙個處在學習之路的渣渣,被乙個時間複雜度的題給難倒了,然後我就思考了一下什麼是時間複雜度。雖然在學校學習了了演算法的課程,但是仔細一想,對於時間複雜度還真是不怎麼懂。於是重新學習,記下自己的一些理解。1.時間複雜度 提到時間複雜度,第一時間想到的是演算法,簡單說,演算法就是你解...