归并排序嘛,其实很容易呀,呵呵,
原来c++还自带有merge函数。。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
#define N 100010
#define eps (1e-8)
#define INF 99999999
using namespace std;
int f1[N],f2[N],n,ans=0;
void print()
{
for(int i=0;i<n;i++) cout<<f1[i]<<" ";
cout<<"ans="<<ans<<"\n";
}
bool scan()
{
if(cin>>n)
for(int i=0;i<n;i++) cin>>f1[i];
else return 0;
return 1;
}
void Merge(int a,int mid,int b)
{
int k1=a,k2=mid+1,k=a;
while(k1<=mid && k2<=b)
{
if(f1[k1]<=f1[k2])
f2[k++]=f1[k1++];
else
f2[k++]=f1[k2++],ans+=mid-k1+1;
}
while(k1<=mid)
f2[k++]=f1[k1++];
while(k2<=b)
f2[k++]=f1[k2++];
for(int i=a;i<=b;i++) f1[i]=f2[i];
}
void mergeSort(int a,int b)
{
if(a>=b) return;
int mid=(a+b)/2;
mergeSort(a,mid);mergeSort(mid+1,b);print();
Merge(a,mid,b);
//merge(&f1[a],&f1[mid+1],&f1[mid+1],&f1[b+1],&f2[a]);
//for(int i=a;i<=b;i++) f1[i]=f2[i];
}
int main()
{
while(scan())
{
mergeSort(0,n-1);
print();
}
return 0;
}