给定一个整数序列,请按非递减序输出采用二路归并排序(递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。
输出格式:
对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。
输入样例:
6
73 12 27 98 81 64
输出样例:
12 73 27 98 81 64
12 27 73 98 81 64
12 27 73 81 98 64
12 27 73 64 81 98
12 27 64 73 81 98
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<stdlib.h>
int a[110];
int n;
void merge(int a[],int tem[],int p,int q,int r)
{
int i=p;int j=q+1;int pos=p;
while(i<=q&&j<=r)
{
if(a[i]<a[j])
tem[pos++]=a[i++];
else
tem[pos++]=a[j++];
}
while(i<=q)
tem[pos++]=a[i++];
while(j<=r)
tem[pos++]=a[j++];
while(p<=r)
{
a[p]=tem[p];
p++;
}
}
void print(int s[],int n)
{
int t=0;
for(t=0;t<n;t++)
{
printf("%d",s[t]);
if(t==n-1)
{
printf("\n");
}else{
printf(" ");
}
}
}
void msort(int a[],int tem[],int p,int r)
{
if(p<r)
{
int q=(p+r)/2;
msort(a,tem,p,q);
msort(a,tem,q+1,r);
merge(a,tem,p,q,r);
print(a,n);
}
}
void merge_sort(int a[],int n)
{
int tem[n];
msort(a,tem,0,n-1);
}
int main()
{int i=0;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
merge_sort(a,n);
}
return 0;
}