题目描述:
归并排序是基于归并操作完成的,而一次归并操作是通过两个或两个以上的有序表合并成一个新的有序表完成的。常见的归并排序是2-路归并排序,其核心操作是将一维数组中前后相邻的两个有序序列归并成一个有序序列。其算法可以描述如下:
在本题中,读入一串整数,将其使用以上描述的2-路归并排序的方法从小到大排序,并输出。
输入:
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出:
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入:
10
2 8 4 6 1 10 7 3 5 9
样例输出:
1 2 3 4 5 6 7 8 9 10
参考代码:
#include<bits/stdc++.h>
using namespace std;
int B[1001];//辅助数组B
//A[low...mid]和A[mid+1...high]各自有序,将两个部分归并
void Merge(int A[],int low,int mid,int high){
int i,j,k;
for(k=low;k<=high;k++){
B[k]=A[k];
}
for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
if(B[i]<B[j]){
A[k]=B[i++];
}
else{
A[k]=B[j++];
}
}
while(i<=mid)
A[k++]=B[i++];
while(j<=high)
A[k++]=B[j++];
}
void MergeSort(int A[],int low,int high){
if(low<high){
int mid=(low+high)/2;
MergeSort(A,low,mid);
MergeSort(A,mid+1,high);
Merge(A,low,mid,high);
}
}
int main()
{
int n,A[1001];
while(cin>>n){
for(int i=0;i<n;i++)
cin>>A[i];
MergeSort(A,0,n-1);
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
}
return 0;
}