快速排序(模板題)

2021-10-07 11:43:34 字數 1211 閱讀 3015

acwing 785

給定你乙個長度為n的整數數列。

請你使用快速排序對這個數列按照從小到大進行排序。

並將排好序的數列按順序輸出。

輸入格式

輸入共兩行,第一行包含整數 n。

第二行包含 n 個整數(所有整數均在1~109

範圍內),表示整個數列。

輸出格式

輸出共一行,包含 n 個整數,表示排好序的數列。

資料範圍

1≤n≤100000

輸入樣例:

5

3 1 2 4 5

輸出樣例:
1 2 3 4 5
void

quick_sort

(int q,

int l,

int r)

quick_sort

(q, l, j)

,quick_sort

(q, j +

1, r)

;}

這種方式會將陣列劃分為小於等於和大於等於pivot 的左右兩部分,並且每一部分都不會為空,因為每次遞迴的時候陣列的長度都會變小從而確保不會死迴圈。如果每次都選取陣列最左邊的元素來作為pivot,當陣列已經是有序的時候每次遞迴陣列的長度只會減少一,導致時間複雜度變為 o(n2)

,這可以通過選中間元素作為pivot或者每次隨機選取陣列中乙個元素與最左邊的元素交換來解決。注意這裡不能用最右邊的元素作為pivot,這樣如果陣列最右邊是最大元素的話會導致劃分完[l, j]不變導致死迴圈。

由於劃分完成後pivot不一定在這兩部分的分界線上,所以在做比如得到第k大的數這種題目時不能用j - l + 1 == k來判斷q[j]為第k大的數,因為左半區間只保證了所有數小於等於 pivot,而不一定都小於等於q[j]。

#include

using

namespace std;

const

int n =

100010

;int a[n]

;void

quick_sort

(int q,

int l,

int r)

quick_sort

(q,l,j)

,quick_sort

(q,j+

1,r);}

intmain()

排序 快速排序模板

以某個記錄 元素 為界 該記錄稱為支點或樞軸 將待排序列分成兩部分 一部分 所有記錄的關鍵字大於等於支點記錄的關鍵字 另一部分 所有記錄的關鍵字小於支點記錄的關鍵字 演算法描述 1 任取待排序記錄序列中的某個記錄 例如取第乙個記錄 作為基準 樞 按照該記錄的關鍵字大小,將整個記錄序列劃分為左右兩個子...

快速排序 模板

說明 經過本函式處理後,陣列itemarray中元素滿足prulefunc itemarray itemr itemarray iteml 為true,其中itemr iteml template t void quicksort itemarray,int iteml,int itemr,bool...

模板 快速排序

排序演算法可以說是從語言步入演算法的第一道坎了,其中最有代表性的莫過於快排。這裡模擬庫函式自帶sort的呼叫方式,寫起來相當自然清爽。樸素快速排序演算法的複雜度最好為o nlogn 最壞時能達到o n include include include include include include d...