#include <iostream>
using namespace std;
int length=10;
int *data;
void Merge(int first,int last1,int last2)
{
int i,j,k;
int *temp=new int[length];
i=first;j=last1+1;k=first;
while (i<=last1&&j<=last2)
{
if(data[i]<=data[j])
temp[k++]=data[i++];
else
temp[k++]=data[j++];
}
while (i<=last1)
{
temp[k++]=data[i++];
}
while (j<=last2)
{
temp[k++]=data[j++];
}
for(i=first;i<=last2;i++)
{
data[i]=temp[i];
}
delete[] temp;
}
void MergePass(int h)
{
int i=0;
while (i+2*h<=length)
{
Merge(i, i+h-1, i+2*h-1);
i=i+2*h;
}
if(i+h<length)
{
Merge(i, i+h-1, length-1);
}
}
void MergeSort()
{
int h=1;
while (h<length)
{
MergePass(h);
h=h*2;
}
}
int main()
{
data=new int[length]{1,5,2,57,21,65,21,78,21,76};
MergeSort();
for(int i=0;i<10;i++)
{
cout<<data[i]<<"\t";
}
cout<<endl;
}