P1177 【模板】排序
## 题目描述
将读入的N个数从小到大排序后输出。
## 输入格式
第一行为一个正整数 N。
第二行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数。
## 输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
## 样例 #1
### 样例输入 #1
5
4 2 4 5 1
### 样例输出 #1
1 2 4 4 5
## 提示
对于 20% 的数据,有 1 <= N <=10^3;
对于 100% 的数据,有 1<=N<=10^5,1<=ai<=10^9。
并归排序
并归排序大概是这样的流程
题解
#include <stdio.h>
int a[600001],b[600001];
void merge(int left, int right)
{
int mid = (left + right) / 2;
int i = left, j = mid + 1, temp = left;
while (i <= mid && j <= right) { //合并
b[temp++]=a[i] <= a[j] ? a[i++]:a[j++];
}
while (i <= mid) { //还有剩余时,选择较小的放入b数组中
b[temp++] = a[i++];
}
while (j <= right) {
b[temp++] = a[j++];
}
for (int i = left; i <= right; i++) {
a[i] = b[i];
}
return;
}
void mergeSort(int left,int right)
{
if (left < right)
{
int mid = (left + right) / 2;
mergeSort(left, mid); // 先给左子序列排序。
mergeSort(mid + 1, right); //再给右子序列排序。
merge(left,right); // 最后把两个子序列合并。
}
return ;
}
int main()
{
int n,i;
scanf("%d",&n);
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);
}
mergeSort(0, n-1);
for (i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}