#include <iostream>
using namespace std;
void merge(int*a,int a1,int a2,int a3)
{ int n1,n2;
int*leftarray=NULL;
int*rightarray=NULL;
n1=a2-a1+1;
n2=a3-a2;
leftarray=(int*)malloc(sizeof(int)*(n1));
rightarray=(int*)malloc(sizeof(int)*(n2));
int i,j;
for(i=0;i<n1;i++)
leftarray[i]=a[a1+i];
for(j=0;j<n2;j++)
rightarray[j]=a[a2+1+j];
i=j=0;
int t=a1;
while(i<n1&&j<n2)
{
if(leftarray[i]>rightarray[j])
a[t++]=leftarray[i++];
else
a[t++]=rightarray[j++];
}
for(;i<n1;i++)
a[t++]=leftarray[i++];
for(;j<n2;j++)
a[t++]=rightarray[i++];
}
void mergesort(int*a,int k,int n)
{ int m=0;
if(k<n)
{
m=(n+k)/2;
mergesort(a,k,m);
mergesort(a,m+1,n);//divide and conquer
merge(a,k,m,n);
}
}
int main()
{
int a[10]={3,2,4,5,3,9,14,123,8,17};
mergesort(a,0,9);
for(int i=0;i<10;i++)
cout<<a[i];
system("pause");
return 0;}