递归解法:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int a[maxn],temp[maxn];
void Merge(int a[],int L1,int R1,int L2,int R2)
{
int i=L1,j=L2,k=0;
while(i<=R1&&j<=R2)
{
if (a[i]<a[j])
{
temp[k++]=a[i++];
}
else
{
temp[k++]=a[j++];
}
}
while (i<=R1)temp[k++]=a[i++];
while (j<=R2)temp[k++]=a[j++];
for (i=0;i<k;i++)
{
a[L1++]=temp[i];
}
}
void mergesort(int a[],int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
mergesort(a,left,mid);
mergesort(a,mid+1,right);
Merge(a,left,mid,mid+1,right);
}
}
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
mergesort(a,0,n-1);
for (int i=0;i<n;i++)
{
printf("%d\n",temp[i]);
}
}
非递归解法:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int a[maxn],temp[maxn];
int n;
void Merge(int a[],int L1,int R1,int L2,int R2)
{
int i=L1,j=L2,k=0;
while(i<=R1&&j<=R2)
{
if (a[i]<a[j])
{
temp[k++]=a[i++];
}
else
{
temp[k++]=a[j++];
}
}
while (i<=R1)temp[k++]=a[i++];
while (j<=R2)temp[k++]=a[j++];
for (i=0;i<k;i++)
{
a[L1++]=temp[i];
}
}
void mergesort(int a[])
{
for (int step=2;step/2<=n;step+=2)
{
for (int i=0;i<n;i+=step)
{
int mid=i+step/2;
if (mid<n)
Merge(a,i,mid-1,mid,min(mid,n-1));
}
}
}
int main()
{
cin>>n;
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
mergesort(a);
for (int i=0;i<n;i++)
{
printf("%d\n",temp[i]);
}
}