快速排序為什麼快?

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   資料   2014   

這是曾經思考過的問題,它為什麼叫快速排序呢?思考無果,然後忘記了,然後昨天被問起,自然想不出很好的答案。直到,看到了《暗時間》上有這個問題的答案。

 

在《暗時間》裡,作者劉未然並沒有直接給出答案,而是先說了兩個遊戲,猜數字和稱球。這兩個問題都很好理解,並且不難解答。然而,令我豁然開朗的是,他們指向了同一個思想,分而治之!把問題不斷切割一半又一半,直到答案水落石出。

 

回到正題,我們的目標是排序,無論哪個排序方法都是基於兩兩比較的,問題在於如何才能減少比較的次數呢?舉個例子,有這麼一組數:1,2,3,4,5,15,78,89,90,100,200;一共11個。並且給出的初始順序是從小到大的,現在要排成從大到小。快速排序的思想,就是從中抽取一個數(稱為基準吧),然後大於基準的在一邊,小於或等於在另一邊。比如,現在隨機的抽取了78,那麼1,2,3,4,5,15會在一邊,89,90,100,200會在另一邊。這時候,注意到,從這一刻開始,小於78的那些數就再也沒有機會與大於78的數進行兩兩比較了。快速排序用了分而治之的思想,雖然,由於隨機抽取,我們最好第一次抽到的是15,這樣就平分了。但是沒關係。忽略掉這個隨機性因素,快排還是把大問題分成了兩個小問題,哪怕這兩個字問題不一定對等。只要遞迴下去,結果水到渠成。

 

相反,我們看看同樣是理論上與快排一樣的時間複雜度(O(nlogn))的堆排序,就說最大堆吧,它把最大的元素移除後,把最後的葉子結點拿上來,是為了重建堆。但是,明顯,拿上的值是要比它的兩個葉子結點要小很多的。它要比較很多次,才能回到合適的位置。並且,我發現,在父結點的值與子樹結點的值比較前,左子樹和右子樹要先比較大小,然後拿出最大的那個才去跟父節點去比較大小。

兩次兩兩比較,才換來一次有意義的交換,如此迴圈下去,堆排序做了很多無用功!

 

以上,從邏輯上分析了快速排序為什麼比歸併排序和堆排序快的原因。但,這還是不夠的。接著,從數學統計上分析他們的時間複雜度——

(1)堆排序——

在構建堆的過程中,因為我們是完全二叉樹從最下層最右邊的非終端結點開始構建,將它與其孩子進行比較和若有必要的互換,對於每個非終端結點來說,其實最多進行兩次比較和互換操作,因此整個構建堆的時間複雜度為O(n)。

在正式排序時,第i次取堆頂記錄重建堆需要用O(logi)的時間(完全二叉樹的某個結點到根結點的距離為.log2i.+1),並且需要取n-1次堆頂記錄,因此,重建堆的時間複雜度為O(nlogn)。

(2)歸併排序——

假如用T(n)表示使用歸併排序對n個元素構成的數組進行排序而使用的時間,用mergeTime來表示將兩個子分組合并起來而花費的時間。那麼

T(n) = T(n/2)+T(n/2) + mergetime

而megeTime就是歸併兩個子數組所耗費的時間,以最大時間來算,最多需要n-1次來比較兩個子數組的元素,然後n次移動到臨時數組中。那麼mergetime就是2n -1 。

因此 T(n) = T(n/2)+ T(n/2) +2n -1 。

 

(3)快速排序——

在最差的情況下,要把n個元素的數組劃分,需要n次比較和n次移動。假設用T(n)來表示使用快速排序演算法來排序n個元素的數組所耗費的時間。那麼

 T(n) = T(n/2)+ T(n/2) +2n

 

如此看來,有人可能就想到了,從數學公式上看,歸併排序還比快排要少個1呢,是不是要快些?其實,不是這樣的,請注意到那幾個字"最差的情況下",就是在我每次選擇的基準,取決於輸入的基準,都是最不理想的基準,恰好要移動最多次才能達到目的。但是這種情況的出現的機率是1/(2^n),非常非常小,而且,這是最普通的快速排序方法,先人提出了很多改進最佳化的方案,其中一種被很常用的就是採用隨機函數來選擇基準來避免最壞的情況的發生。

 

在暢銷的ACM資訊競賽教材《演算法藝術與資訊學競賽》上,作者也提出了關於快排的效率與最佳化問題——


 

正如我們所分析的,一旦我們採用隨機函數來產生基準,那麼時間複雜度計算公式裡,

 T(n) = T(n/2)+ T(n/2) +2n 裡2n就不再是2n了,也許是1,也許是2...但是,最後的結果肯定是要比2n小很多了。

 

至於堆排序,明顯,堆排序主要是堆調整的時間很耗時,90%的時間耗在堆調整上。因此在資料量大的時候,明顯是要落後很多的。

 

至此,我想我明白了為什麼快排比其他兩種都要快了,因為它善於分解子問題,從不做無用功。雖然有最糟糕的情況,但是這個是可以最大限度降低其出現機率的。有不同意見的,歡迎拍磚,謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.