#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<cmath>
#include<algorithm>
#include<set>
#include<vector>
#include<climits>
#define Equal(a,b) (fabs((a)-(b))<=eps)
#define LessEqu(a,b) (((a)-(b))<=eps)
#define Lessthan(a,b) (((a)-(b))<-eps)
#define Morethan(a,b) (((a)-(b))>=eps)
#define MoreEqu(a,b) (((a)-(b))>=-eps)
using namespace std;
typedef long long ll;
const double eps = 1e-5;
const ll mod = 1000000007;
const int maxn = 100010;
int ans[maxn],arr[maxn];
void merge_sort(int l,int r){
if(l>=r)return;
int mid = l+(r-l)/2;
merge_sort(l,mid);
merge_sort(mid+1,r);
int a,b,cnt = l;
for(a=l,b=mid+1;a<=mid&&b<=r;){
if(arr[a]<=arr[b])
ans[cnt++] = arr[a],a++;
else
ans[cnt++] = arr[b],b++;
}
while(a<=mid)ans[cnt++] = arr[a++];
while(b<=r)ans[cnt++] = arr[b++];
for(int i=l;i<=r;i++)
arr[i] = ans[i];
}
int main(){
int n;
scanf("%d",&n);
while(n--){
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d",&arr[i]);
merge_sort(1,m);
for(int i=1;i<=m;i++)
printf("%d%c",ans[i],i==m?'\n':' ');
}
return 0;
}
递归版本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<cmath>
#include<algorithm>
#include<set>
#include<vector>
#include<climits>
#define Equal(a,b) (fabs((a)-(b))<=eps)
#define LessEqu(a,b) (((a)-(b))<=eps)
#define Lessthan(a,b) (((a)-(b))<-eps)
#define Morethan(a,b) (((a)-(b))>=eps)
#define MoreEqu(a,b) (((a)-(b))>=-eps)
using namespace std;
typedef long long ll;
const double eps = 1e-5;
const ll mod = 1000000007;
const int maxn = 100010;
int ans[maxn],arr[maxn];
void merge_sort(int l,int mid,int r){
int a = l,b = mid+1,cnt=l;
for(;a<=mid&&b<=r;){
if(arr[a]<=arr[b])
ans[cnt++] = arr[a++];
else
ans[cnt++] = arr[b++];
}
while(a<=mid)ans[cnt++] = arr[a++];
while(b<=r)ans[cnt++] = arr[b++];
for(int i=l;i<=r;i++)
arr[i] = ans[i];
}
int main(){
int n;
scanf("%d",&n);
while(n--){
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d",&arr[i]);
for(int step = 2;step/2<=m;step*=2){
for(int i=1;i<=m;i+=step){
int mid = i+step/2-1;
if(mid<m)
merge_sort(i,mid,min(i+step-1,m));
}
}
for(int i=1;i<=m;i++)
printf("%d%c",ans[i],i==m?'\n':' ');
}
return 0;
}
迭代