1、題目(來自於acwing):
給定你乙個長度為n的整數數列。
請你使用快速排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在1~109範圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
資料範圍
1≤n≤100000
輸入樣例:
53 1 2 4 5
輸出樣例:
1 2 3 4 5
2、基本思想:
用分治的思想。選定乙個標桿數x,將小於x的數放在x左側,將大於x的數放在x右側。對於兩邊分好的數在分別運用同樣的方法排序(遞迴)。
3、步驟:
①確定分界點 q[a],q[(a+b)/2],q[b]
②調整為左右兩個區間
③遞迴(左右分別排序)
#include
void
quick_sort
(int q,
int l,
int r)
;using
namespace std;
const
int n =
1e6+10;
int n, q[n]
;int
main()
quick_sort
(q,0
, n-1)
;for
(int i=
0; i
)return0;
}void
quick_sort
(int q,
int l,
int r)
//l為最左端資料的下標,r為最右端資料的下標
//這個迴圈的功能就是將標桿數x左右兩端的數分好,小的在左側,大的在右側
quick_sort
(q, l, j)
;//遞迴排x左側的資料
quick_sort
(q, j +
1, r)
;//遞迴排x右側的資料
}//該**改編自(僅有部分寫法改動):
注意事項:
標桿數x最好選擇中間數,或者隨機值,取左右端點值會超時。
Acwing 785 快速排序
給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格式 輸入共兩行,第一行包含整數 n。第二行包含 n 個整數 所有整數均在1 109109範圍內 表示整個數列。輸出格式 輸出共一行,包含 n 個整數,表示排好序的數列。資料範圍 1 n 1...
快速排序 Acwing785 快速排序
快排最壞情況為 o n2 本題若遇到最壞情況會超時,故我們需要優化快排,每次取中間的數,而不是取邊界的數 最壞情況分析 序列已經有序 每次取左區間的數進行快排,每次呼叫函式遍歷r l次,呼叫函式次數為n次,時間複雜度o n2 每次取中間的數進行快排,每次呼叫函式遍歷r l次,呼叫函式次數為logn次...
快排 AcWing785 快速排序
給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格式 輸入共兩行,第一行包含整數n。第二行包含n個整數 所有整數均在1 109範圍內 表示整個數列。輸出格式 輸出共一行,包含n個整數,表示排好序的數列。資料範圍 1 n 100000輸入樣...