题目描述
这是一个很简单的排序题目. 为了锻炼大家对不同算法的了解,请大家用归并排序法对此题进行解答. 对一组整数数列A[1],A[2],A[3]......A[N]进行排序,按照从小到大的顺序输出.
输入
本题只有一组测试数据,在输入的第一行输入N(表示整数数列的大小)(N < 1000) 接下来N行输入N个整数,每一行一个整数.
输出
对已经排好序的数从小到大依次输出,每两个数之间用两个空格隔开,且每输出10个数换行.
#include<bits/stdc++.h>
using namespace std;
void merge(int b[],int a[],int left,int right) {
int mid=left+(right-left)/2;
int l=right-left+1;//求要排序 部分的长度
int left0=left; //记录a数组的起始坐标
int i=0;//b数组下标从0开始
int k=mid+1;// 后半部分数组的起始坐标
while(left<=mid&&k<=right){
if(a[left]<a[k]){
b[i++]=a[left++];//先赋值再自增
}
else{
b[i++]=a[k++];
}
}
if(left>mid){//前半部分数组已赋值完成,后半部分数组有剩余一个且是最大的(平分的),剩余的追加到b数组中
while(k<=right){
b[i++]=a[k++];
}
}
if(k>right){//后半部分数组已赋值完成,前半部分数组有剩余一个且是最大的(平分的),剩余的追加到b数组中
while(left<=mid){
b[i++]=a[left++];
}
}
for(int j=0;j<l;j++){
a[left0++]=b[j];//把b数组复制到a数组中
}
}
void mergesort(int b[],int a[],int left,int right){
if(left==right){//分成只剩1个数
return ;
}
else{
int mid=left+(right-left)/2;
mergesort(b,a,left,mid);//前半部分数组
mergesort(b,a,mid+1,right);//后半部分数组
merge(b,a,left,right);
}
}
int main(){
int n;
cin>>n;
int a[1001];
for(int i=0;i<n;i++){
cin>>a[i];
}
int b[1001]={0};
mergesort(b,a,0,n-1);
for(int i=0;i<n;i++){
if((i+1)%10==0||i==n-1){
cout<<a[i]<<endl;
}
else{
cout<<a[i]<<" ";
}
}
return 0;
}