1002.归并排序
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给定一个数列,用归并排序算法把它排成升序。
输入
第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。
输出
输出排序后的数列,每个数字占一行。
输入样例
5
3 2 1 4 5
输出样例
1
2
3
4
5
#include <cstdio>
#include <cstdlib>
void Merge(int *list,int low,int mid,int high)
{
int *temp;
int i=low,j=mid+1,k=0;
temp=(int *)malloc(sizeof(int)*(high-low+1));
while(i<=mid && j<=high)
{
if(list[i]<=list[j])
{
temp[k]=list[i];
i++;
k++;
}
else
{
temp[k]=list[j];
j++;
k++;
}
}
while(i<=mid)
{
temp[k]=list[i];
i++;
k++;
}
while(j<=high)
{
temp[k]=list[j];
j++;
k++;
}
for(k=0,i=low;i<=high;k++,i++) //zhu yi deng yu hao
{
list[i]=temp[k];
}
free(temp);
}
void MergeSort(int *list,int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergeSort(list,low,mid);
MergeSort(list,mid+1,high);
Merge(list,low,mid,high);
}
}
int main()
{
int n,list[20000];
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%d",&list[i]);
}
MergeSort(list,0,n-1);
for(int i=0;i<n;i++)
{
printf("%d\n",list[i]);
}
return 0;
}