输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
输入样例 1
10
2 8 4 6 1 10 7 3 5 9
输出样例 1
1 2 3 4 5 6 7 8 9 10
来源
算法设计与分析——排序
C++实现
#include <bits/stdc++.h>
using namespace std;
const int VERTICES = 1e5 + 10;
int a[VERTICES];
void __merge(int a[], int l, int mid, int r) {
int aux[r - l + 1];
for(int i = l; i <= r; i++)
aux[i - l] = a[i];
int i = l, j = mid + 1;
for(int k = l; k <= r; k++) {
if(i > mid) {
a[k] = aux[j - l];
j++;
} else if (j > r) {
a[k] = aux[i - l];
i++;
} else if(aux[i - l] < aux[j - l]) {
a[k] = aux[i - l];
i++;
} else {
a[k] = aux[j - l];
j++;
}
}
}
void __mergeSort(int a[], int l, int r) {
if(l >= r)
return;
int mid = (l + r) / 2;
__mergeSort(a, l, mid);
__mergeSort(a, mid + 1, r);
__merge(a, l, mid, r);
}
void mergeSort(int a[], int n) {
__mergeSort(a, 0, n - 1);
}
void println(int a[], int n) {
for(int i = 0; i < n; i++) {
if(i == 0)
printf("%d", a[i]);
else
printf(" %d", a[i]);
}
printf("\n");
}
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
mergeSort(a, n);
println(a, n);
return 0;
}