#include <bits/stdc++.h>
#include <cstdio>
#define rep(x, y, z) for (int x = y; x <= z; ++x)
#define per(x, y, z) for (int x = y; x >= z; --x)
#define mem(a, x) memset(a, x, sizeof a)
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define all() x.begin(), x.end()
#define x first
#define y second
#define swap(a, b) a = a ^ b, b = b ^ a, a = a ^ b
#define pd push_back
#define endl '\n'
#define il inline
using namespace std;
using ll = long long;
using db = double;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
int rd() {int s = 0, fu = 1; char ch = getchar(); while (ch < '0' || ch > '9') {if (ch == '-') fu = -1; ch = getchar();} while (ch >= '0' && ch <= '9') {s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar();} return s * fu;}
void rt(int x) {int sta[20], tt = 0; if (x < 0) putchar('-'), x = -x; do sta[tt++] = x % 10, x /= 10; while (x); while (tt) putchar(sta[--tt] ^ 48);}
void sao(int x) {rt(x); putchar(' ');}
void wao(int x) {rt(x); putchar('\n');}
int qmi(ll a, int b) {ll res = 1; while (b) {if (b & 1) res = res * a; a = a * a; b >>= 1;} return res;}
int qmi(ll a, int b, int p) {ll res = 1 % p; while (b) {if (b & 1) res = res * a % p; a = a * a % p; b >>= 1;} return res;}
const int N = 1e5 + 10;
int n, m, a[N], sa[N], c[10], r[N], v[N];
void countingsort() {
memset(c, 0, sizeof c);
for (int i = 1; i <= n; ++i) {
++c[v[i]];
}
for (int i = 1; i < 10; ++i)
c[i] += c[i - 1];
for (int i = n; i; --i) {
r[sa[i]] = c[v[sa[i]]]--;
}
for (int i = 1; i <= n; ++i)
sa[r[i]] = i;
}
void radixsort() {
for (int i = 1; i <= n; ++i) {
sa[i] = i;
}
for (int i = 1, x = 1; i <= m; ++i, x *= 10) {
for (int j = 1; j <= n; ++j) {
v[j] = a[j] / x % 10;
}
countingsort();
}
}
int get(int x) {
int ans = 0;
do ++ans, x /= 10; while (x);
return ans;
}
int main() {
n = rd();
for (int i = 1; i <= n; ++i) {
a[i] = rd();
m = max(m, get(a[i]));
}
radixsort();
for (int i = 1; i <= n; ++i)
sao(a[sa[i]]);
return 0;
}
快速排序
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int q[N];
void quick_sort(int q[], int l, int r)
{
if (l >= r)return;
int i = l - 1;
int j = r + 1;
int x = q[(l + 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]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
scanf("%d", &q[i]);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i ++ )
printf("%d ", q[i]);
printf("\n");
return 0;
}
归并排序
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, a[100010],tmp[100010];
void mysort(int l, int r)
{
if (l >= r)return;
int mid = l + r >> 1;
mysort(l, mid), mysort(mid + 1, r);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r)
if (a[i] <= a[j]) tmp[k ++ ] = a[i ++ ];
else tmp[k ++ ] = a[j ++ ];
while (i <= mid) tmp[k ++ ] = a[i ++ ];
while (j <= r) tmp[k ++ ] = a[j ++ ];
for (int q = l, e = 0; q <= r; e ++ , q ++ )
a[q] = tmp[e];
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
scanf("%d", &a[i]);
mysort(1, n);
for (int i = 1; i <= n; i ++ )
printf("%d ", a[i]);
printf("\n");
return 0;
}