据说ACM存在N种排序...现在的合并排序时间复杂度是O(nlogn) 呵呵,确实有时候的学习下...
简单型的...
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#define M 0x7fffffff
using namespace std;
int main()
{
int a[100],b[100],c[100],n,m,i;
while (~scanf("%d%d",&n,&m))
{
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<m;i++)
scanf("%d",&b[i]);
sort(a,a+n);
sort(b,b+m);
a[n]=M;
b[m]=M;
int l=n+m;
int k1=0,k2=0;
for (i=0;i<l;i++)
{
if (a[k1]<=b[k2])
c[i]=a[k1++];
else
c[i]=b[k2++];
}
for (i=0;i<l;i++)
printf("%d ",c[i]);
}
return 0;
}
函数型的...
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define M 0x7fffffff
int a[1000];
void fff(int *a,int begin,int mid,int end)
{
int i,j;
int k1=mid-begin+1;
int k2=end-mid;
int L[k1+5];
int R[k2+5];
for (i=1;i<=k1;i++)
L[i]=a[begin+i-1];
for (i=1;i<=k2;i++)
R[i]=a[mid+i];
L[k1+1]=M;
R[k2+1]=M;
i=1;j=1;
for (int k=begin;k<=end;k++)
{
if (L[i]<=R[j])
a[k]=L[i++];
else
a[k]=R[j++];
}
}
void ff(int *a,int begin,int end)
{
if (begin<end)
{
int t=(begin+end)/2;
ff(a,begin,t);
ff(a,t+1,end);
fff(a,begin,t,end);
}
}
int main()
{
int n,i;
while (~scanf("%d",&n))
{
for (i=0;i<n;i++)
scanf("%d",&a[i]);
ff(a,0,n-1);
for (i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
return 0;
}
增加一条代码即可求出数列的逆序数...
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define M 0x7fffffff
int a[500010];
__int64 ans;
void fff(int *a,int begin,int mid,int end)
{
int i,j;
int k1=mid-begin+1;
int k2=end-mid;
int L[k1+5];
int R[k2+5];
for (i=1;i<=k1;i++)
L[i]=a[begin+i-1];
for (i=1;i<=k2;i++)
R[i]=a[mid+i];
L[k1+1]=M;
R[k2+1]=M;
i=1;j=1;
for (int k=begin;k<=end;k++)
{
if (L[i]<=R[j])
a[k]=L[i++];
else
{
a[k]=R[j++];
ans+=k1-i+1;
}
}
}
void ff(int *a,int begin,int end)
{
if (begin<end)
{
int t=(begin+end)/2;
ff(a,begin,t);
ff(a,t+1,end);
fff(a,begin,t,end);
}
}
int main()
{
int n,i;
while (~scanf("%d",&n) && n)
{
for (i=0;i<n;i++)
scanf("%d",&a[i]);
ans=0;
ff(a,0,n-1);
printf("%I64d\n",ans);
//for (i=0;i<n;i++)
// printf("%d ",a[i]);
//printf("\n");
}
return 0;
}