1. 程式人生 > 實用技巧 >Luogu 塊速遞推 | 光速冪模板

Luogu 塊速遞推 | 光速冪模板

快速排序

快速排序的基本思想

  • 利用分治的思想

快速排序的基本思路

將陣列分成兩個部分,一個部分大於某個數,一個部分小於某個數,然後遞迴,直到所有的數字都排序完成

  1. 邊界判斷l >= rreturn
  2. 設定一個x值,這個x值可以是左邊界l,右邊界r,或者是(l + r)/2,甚至是隨機的值(不能超過邊界)
  3. 移動資料,將 <= x的值放在x的左邊,將 >= x的值放在x的右邊
  4. 遞迴

如何移動資料

開闢新的陣列

方法一開闢兩個新的陣列,一個數組用來存放<= x的值,一個數組用來存放>= x的值

利用兩個指標

在陣列的頭部和尾部各使用一個指標

  1. 先看左指標:左指標指向的值是否<= x
    如果是,那麼指標指向下一個資料(指標方向往右走),如果不是停止移動
  2. 再看右指標:右指標指向的值是否>= x 如果是,那麼指標指向上一個資料(指標方向往左走),如果不是停止移動
  3. 判斷左指標 < 右指標 正確的話就直接交換
  4. 重複這三步,當出現左指標 >= 右指標的時候退出迴圈

快排模板

#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;
}