排序算法模板

187 阅读1分钟

快速排序+归并排序

#include <iostream>

using namespace std;

const int N = 1e6 + 10;

int n;
int A[N];
int temp[N]; //归并排序临时数组

void quick_sort(int A[], int l, int r){
    if(l >= r) return;
    int x = A[l + r >> 1] , i = l - 1 , j = r + 1;
    while(i < j){
        do i++; while(A[i] < x);
        do j--; while(A[j] > x);
        if(i < j) swap(A[i], A[j]);
    }
    quick_sort(A,l,j);
    quick_sort(A,j + 1, r);
}

void merge_sort(int A[], int l , int r){
    if(l >= r) return;
    int mid = l + r >> 1;
    merge_sort(A, l, mid);
    merge_sort(A, mid + 1 , r);
    int k = 0 , i = l , j = mid + 1;
    while(i <= mid && j <= r){
        if(A[i] <= A[j]){
            temp[k ++] = A[i ++];
        }else{
            temp[k ++] = A[j ++];
        }
    }
    while(i <= mid) temp[k ++] = A[i ++];
    while(j <= r) temp[k ++] = A[j ++];
    for(int i = l,j = 0; i <= r; i ++, j ++) A[i] = temp[j];
}

int main(){
    cin >> n;
    for(int i = 0; i < n; i ++){
        scanf("%d",&A[i]);
    }
    merge_sort(A, 0, n - 1);
    for(int i = 0; i < n; i ++){
        printf("%d ",A[i]);
    }
    return 0;
}

快速选择

// acwing 786

#include <iostream>

using namespace std;

const int N = 1e5 + 19;

int n, k, a[N];

int quick_sort(int a[], int l, int r, int k){
    if(l == r) return a[l];
    int i = l - 1, j = r + 1, x = a[l + r >> 1];
    while(i < j){
        while(a[++ i] < x);
        while(a[-- j] > x);
        if(i < j) swap(a[i], a[j]);
    }
    int cl = j - l + 1;
    if(k <= cl) return quick_sort(a, l, j, k);
    else return quick_sort(a, j + 1, r, k - cl);
}

int main(){
    cin >> n >> k;
    for(int i = 0; i < n; i ++) cin >> a[i];
    cout << quick_sort(a, 0, n - 1, k);
    return 0;
}