#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
#define NUM 5
int number=0;
void MergeSort(int *a,int length);
void MergePart(int *a,int *b,int l,int r);
void MergeUnion(int *a,int *b,int l,int m,int r);
void copy(int *a,int *b,int l,int r);
void copy(int *a,int *b,int l,int r)
{
while(l<=r)
{
a[l]=b[l];
l++;
}
}
void MergeUnion(int *a,int *b,int l,int m,int r) //关键函数,需要仔细设计算法
{
int i=l;
int j=m+1;
while(i<=m&&j<=r)
{
if(a[i]<=a[j])
{
b[l++]=a[i++];
// i++;
}
else
{
b[l++]=a[j++];
//j++;
number+=m-i+1; //因为 a[l..m]已经递增有序,a[l]>a[j],则a[l..m]>a[j]
}
}
while(i<=m)
b[l++]=a[i++];
while(j<=r)
b[l++]=a[j++];
}
void MergePart(int *a,int *b,int l,int r)
{
int m;
if(l<r)
{
m=(l+r)/2;
MergePart(a,b,l,m);
printf("l----%d;m-----%d/n",l,m);
MergePart(a,b,m+1,r);
MergeUnion(a,b,l,m,r);
copy(a,b,l,r);
}
}
void MergeSort(int *a,int length)
{
//int *b=(int *)malloc(sizeof(int)*length);
int *b=new int[length];
MergePart(a,b,0,length-1);
delete [] b;
}
int main(int argc,char *argv)
{
int a[NUM]={2,3,8,6,1};
for(int i=0;i<NUM;i++)
cout<<a[i];
cout<<endl;
MergeSort(a,NUM);
for(int i=0;i<NUM;i++)
cout<<a[i];
cout<<endl<<number<<endl;
}