ACM 训练日志记录 · 思考 · 成长 提交 / 修改记录
廖夏 / 题目列表训练档案
导出

P1177 【模板】排序

来源:洛谷 ★ 1000

排序仍在学习
本题活力0.30按难度、完成结果与训练证据估算

算法如山行则将至

题目描述

【模板】排序

题目描述

将读入的 $N$ 个数从小到大排序后输出。

输入格式

第一行为一个正整数 $N$。

第二行包含 $N$ 个空格隔开的正整数 $a_i$,为你需要进行排序的数。

输出格式

将给定的 $N$ 个数从小到大输出,数之间空格隔开。

说明/提示

对于 $20\%$ 的数据,有 $1 \leq N \leq 10^3$;

对于 $100\%$ 的数据,有 $1 \leq N \leq 10^5$,$1 \le a_i \le 10^9$。

样例 1

输入:

5
4 2 4 5 1

输出:

1 2 4 4 5

代码

#include<iostream>
using namespace std;
const int MAXN = 1e5 + 5;
int a[MAXN];

void quick_sort(int l, int r){
    if (l >= r) return; // 空区间,递归终止;当每个子块的长度小于1时自然成立,整个序列排序完成
    // 1. 每次选取一个基准值,分为大于pivot和小于pivot两个部分
    int pivot = a[(l + r) / 2];
    int i = l - 1, j = r + 1; // 配合do-while,实现左闭右闭
    // 2. 将小于pivot和大于pivot的分别放在两边
    int mid; // mid 表示最终指针得到的中点
    while (i < j){
        // 双指针,将两边需要放到对面的swap
        do i++; while (a[i] < pivot); // 无需换就下一个
        do j--; while (a[j] > pivot);
        if (i < j) swap(a[i], a[j]);
    }
    mid = j;
    // 分治:左右分开
    quick_sort(mid + 1, r);
    quick_sort(l, mid);
}

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