快速排序

int a[N];//待排序数组
inline void swap(int& x, int& y) {
    int tmp = x;
    x = y;
    y = tmp;
}
void quick_sort(int l, int r) {
    if (l >= r)return;
    swap(a[l], a[(l + r) / 2]);
    int i = l, j = r, x = a[l];
    while (i < j) {
        while (i < j && a[j] >= x)j--;
        if (i < j)a[i++] = a[j];
        while (i < j && a[i] < x)i++;
        if (i < j)a[j--] = a[i];
    }
    a[i] = x;
    quick_sort(l, i - 1);
    quick_sort(i + 1, r);
}

选择排序

int a[N];//待排序数组
inline void swap(int& x, int& y) {
    int tmp = x;
    x = y;
    y = tmp;
}
void choose_sort(int l, int r) {
    for (int i = l; i < r; i++) {
        int k = i;
        for (int j = i + 1; j <= r; j++) {
            if (a[j] < a[k])k = j;
        }
        swap(a[i], a[k]);
    }
}

归并排序

int a[N];//待排序数组
int b[N];//merge时用的临时数组
void merge(int l, int r) {
    int mid = (l + r) >> 1;
    int i = l, j = mid + 1;
    for (int k = l; k <= r; k++) {
        if (j > r || i <= mid && a[i] < a[j])b[k] = a[i++];
        else b[k] = a[j++];
    }
    for (int k = l; k <= r; k++)a[k] = b[k];
}
void merge_sort(int l, int r) {
    if (l == r)return;
    int mid = (l + r) >> 1;
    merge_sort(l, mid);
    merge_sort(mid + 1, r);
    merge(l, r);
}