快速排序
快排思想:快速排序是分治法的另乙個重要應用。和歸併的演算法思想一樣,也以分治思想為基礎,不同之處在於劃分的標準不同。歸併以陣列元素個數進行劃分,將原陣列劃分為兩個元素個數相當的子問題。快速排序則以關鍵字進行劃分,將原陣列劃分為兩部分,一部分比關鍵字小,另一部分比關鍵字大。
設計思想:分治法。
注意細節:
複雜度分析:
空間複雜度:用於元素交換的空間為o(1),但是由於遞迴的棧空間需要o(n),最好情況也要o(lgn)。
時間複雜度:最好情況,劃分在正**,劃分後每個子問題的規模為原問題的一半,這時候為o(nlgn);最壞情況,劃分為「斜的」(如:為正序或反序時),每次有一邊只有乙個元素,這時為o(n^2);按任意固定比例來劃分原陣列,比如:1/10,9/10,即每次劃分都一邊佔1/10,一邊佔9/10,則和對半劃分的效果一樣,也是o(nlgn),只是常數因子可能會大一些;平均時間的計算使用隨機化方法,結果為o(nlgn)。
穩定性:
不穩定。原因在於,如果選擇關鍵字剛好為其中乙個,則在比較的時候,會調換這兩個元素的位置。這個不能由比較是否為嚴格大於來解決,因為被選的鍵可能是陣列位置小的元素,也可能是陣列位置大的元素。
原地性:快排為原地排序。
應用場景:
元素的排序情況是隨機的;快排在元素數量較大時比其他排序演算法一般有較好的效能。
隨機化演算法
示性函式:概率中的示性函式定義。示性函式在隨機化中的應用。
快排時間複雜度:如果劃分的情況是最好情況,最差情況交替的出現,則最後的複雜度也是o(nlgn)。
隨機化快排
由於快排隨機化情況下比較好,為了解決已排序時複雜度較高的問題,因此在選擇主元關鍵字時隨機選擇,從而將問題進行隨機化。這種情況下,輸入資料不再影響排序的複雜度。因此隨機化快排能達到平均值o(nlgn)。
隨機化快速排序
define max size 100 include include using namespace std 交換指標p1,p2指向的值 void exchange int p1,int p2 pa為指向a的陣列,p,r為下標,對a p.r 進行就地重排,以a r 為主元 劃分為小於主元和大於主元...
隨機化的快速排序
快排是所有排序演算法中平均效能最好的一種排序,雖然它的最壞的情況和氣泡排序一樣是 n 2。但是平均來說為o n logn 現在研究生又開始學演算法了,主要是隨機演算法,分布式演算法,和概率演算法。第一節課講的是隨機化的快速排序,但是我覺得當n比較小的時候不適合隨機演算法,因為隨機的過程也在花費時間,...
快速排序之隨機化
快速排序的思想就是選擇乙個基準數,讓每個數與它比較,找到它在所有這些數排好序後應該在的位置。而快速排序對大體應經排好序的數執行效率是n 2,所以對基準數隨機化,以下 include include using namespace std 產生m到n的隨機數 int random int m,int ...