•快速排序是遞迴的,需要有乙個棧存放每層遞迴呼叫時的指標和引數(新的
low
和
high
)。
•可以證明,函式quicksort的平均計算時間也是o(nlog2n)。實驗結果表明:就平均計算時間而言,快速排序是我們所討論的所有內排序方法中最好的乙個。
•最大遞迴呼叫層次數與遞迴樹的深度一致,理想情況為é
log
2
(
n
+1)
ù。因此,要求儲存開銷為o(log
2
n
)。
•如果每次劃分對乙個物件定位後,該物件的左側子串行與右側子串行的長度相同,則下一步將是對兩個長度減半的子串行進行排序,這是最理想的情況。此時,快速排序的趟數最少。
設每個子表的支點都在中間(比較均衡),則:
第
1
趟比較,可以確定
1
個元素的位置;
第
2
趟比較(
2
個子表),可以再確定
2
個元素的位置;
第
3
趟比較(
4
個子表),可以再確定
4
個元素的位置;
第
4
趟比較(
8
個子表),可以再確定
8
個元素的位置;
……
只需
ë
log
2
n
û
+
1
趟便可排好序。
比賽描述
給定輸入排序元素數目n和相應的n個元素,寫出程式,利用內排序演算法中快速排序演算法進行排序,並輸出排序最後結果的相應序列。
輸入
共兩行,第一行給出排序元素數目n,第二行給出n個元素,1≤n≤100000,每個元素值範圍為 [0,100000)
輸出
一行,輸出排序結果。
樣例輸入
748 36 68 72 12 48 2
樣例輸出
2 12 36 48 48 68 72
老師的~~~
/*
步驟為:
1.從數列中挑出乙個元素,稱為 "基準"(pivot);
2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
3.遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
*/#include#include#include#define random(i) (rand()%i)
#define n 9 //設定陣列長度
//分割槽操作
int partition(int array, int left, int right)
} return j;
}//迭代運算
void quiksort(int array, int left, int right)
}//示例
int main()
} return j;
}void quiksort(int a,int left,int right)
}int main()
NOJ 1003 快速排序
給定乙個數列,用快速排序演算法把它排成公升序。第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出排序後的數列,每個數字佔一行。5 3 2 1 4 5 123 45 include using namespace std void quicksort i...
快速排序C語言
就感覺,自己對這些個排序.至少,腦袋裡還沒有.哎,我老是不專心呢.加油吧.說說快速排序吧.這東西,原理就是不斷地將乙個陣列分成3部分.保持所有陣列處在這種狀態,最終完成排序.這些思想,還沒有掌握.加油吧,我還能說什麼?說些這個,呵呵.這段 起初不懂.後來,隨著不斷手工模擬,發現,採用了很多技巧.也難...
C語言 快速排序
1.快排是對氣泡排序的一種改進,在快速排序中,元素的比較和移動是從兩端向中間進行的,關鍵碼較大的元素一次就能從前面移動到後面,關鍵碼較小的元素一次就能從後面移動到前面,元素移動距離的較遠,從而減少了總的比較次數和移動次數 2.快速排序是基於分治法設計的,其分治策略是 劃分 選定乙個元素作為軸值,以軸...