快速排序 C語言 NOJ1064

2021-07-03 23:54:01 字數 2907 閱讀 1158

快速排序是遞迴的,需要有乙個棧存放每層遞迴呼叫時的指標和引數(新的

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.快速排序是基於分治法設計的,其分治策略是 劃分 選定乙個元素作為軸值,以軸...