Luogu 塊速遞推 | 光速冪模板
阿新 • • 發佈:2020-11-04
快速排序
快速排序的基本思想
- 利用分治的思想
快速排序的基本思路
將陣列分成兩個部分,一個部分大於某個數,一個部分小於某個數,然後遞迴,直到所有的數字都排序完成
- 邊界判斷
l >= r
時return
- 設定一個
x
值,這個x
值可以是左邊界l
,右邊界r
,或者是(l + r)/2
,甚至是隨機的值(不能超過邊界) - 移動資料,將
<= x
的值放在x
的左邊,將>= x
的值放在x
的右邊 - 遞迴
如何移動資料
開闢新的陣列
方法一開闢兩個新的陣列,一個數組用來存放<= x
的值,一個數組用來存放>= x
的值
利用兩個指標
在陣列的頭部和尾部各使用一個指標
- 先看左指標:左指標指向的值是否
<= x
- 再看右指標:右指標指向的值是否
>= x
如果是,那麼指標指向上一個資料(指標方向往左走),如果不是停止移動 - 判斷
左指標 < 右指標
正確的話就直接交換 - 重複這三步,當出現
左指標 >= 右指標
的時候退出迴圈
快排模板
#include <iostream> using namespace std; const int N = 1e6 + 10; int n; int q[N]; void q_sort(int q[], int l, int r){ if(l >= r) return; int x = q[(l + r) >> 1]; int i = l - 1; int j = r + 1; while(i < j){ do { i++ ; } while (q[i] < x); do { j-- ; } while (q[j] > x); if(i < j) swap(q[i], q[j]); } q_sort(q, l, j); q_sort(q, j + 1, r); } int main(){ scanf("%d", &n); for(int i = 0; i < n; i++){ scanf("%d", &q[i]); } q_sort(q, 0, n - 1); for(int i = 0; i < n; i++){ printf("%d ", q[i]); } return 0; }