排序算法集合(3)- 快速排序原理及C#實現

快速排序的思想是:

1)初始輸入值是一串亂序的數字S={s1, s2...sn}

2)選取某個邏輯位置的值爲“中間值”(m),然後經過用S中的其他元素跟m比較:比m大的元素都調整到在“中間值”之前,其餘的放置在“中間值”之後

-->現在,序列成了“準排序”狀態,S被調整爲S',分爲三個部分P={p1, p2 ....} ,M={m}, Q= {q1, q2...},而這三個部分有P>M>Q的關係(P內任意元素>=m>=Q內任意元素)只不過在P,Q的內部還是亂序狀態, 於是,我們如果將P,Q再進行排序,最後就能得到排序結果,而對P,Q的排序,我們可以遞歸調用快速排序算法

3)對P, Q分別遞歸調用快速排序算法進行排序,生成內部排序的P'和Q'.

-->遞歸的終止條件,就是某子序列內只有2個數,於是可以在一次比較(及必要的互換)之後,返回排序序列

4)返回P' + M + Q'

 

在第二步中,我們進行了N次比較,不過通過每次調用,都能達到將序列一分爲二的目的,所以,分割的速度是指數增長的。一般認爲快速排序的算法複雜度爲N log(N);不過它是不穩定算法,最糟糕的情形仍然會達到N^2,這種最差情形,竟然是出在已排序序列上的。 對於一般的隨機亂序而言,快速排序可以比較穩定的用 N*logN的時間複雜度完成。

 

還需要說明一下的是,具體實現快排算法時,注意利用數組位置的交換,而不用新引入其他數組作爲存儲空間。

 

好了,貼上一個本人的實現

1. 以隊尾元素做中間值m,

2. 從1 到 n-1 掃描序列,比m大的元素不動(屬於P),其餘的跟Q序列倒數位置的元素交換,再繼續比對;於是乎,P序列從頭生成,Q序列從隊尾(n-1處)逆向生成,當P,Q的指針相遇時,步驟2)完成

3. 遞歸P, Q; 返回P, M , Q

 

 

 

快拍實戰非常強大,比如,某次在相同條件下開展benchmark,隨機生成10,000個正整數進行排序,冒泡需要77ms, 快排序要0ms;

對於20,000個, 冒泡145 ms, 快排需要1ms. (由於n=20,000,  logn=4*(1+.318), 而0.5n/logn=2000;實際上沒有2000倍這麼誇張了,是因爲快排有很多對調的操作要佔一些時間,但是快百倍還是有的,另外, N越大,二者效率相差的倍數就更大)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章