#include<iostream>
using namespace std;
template <class T>
void MergeSort(T a[],int left,int right);
template <class T>
void Merge(T a[],T b[],int left,int middle,int right);
template<class T>
void Copy(T a[],T b[],int left,int right);
template<class T>
void MergeSort(T a[],int left,int right)
{
if(right>left){
int middle=(left+right)/2;
T b[right-left+1];
MergeSort(a,left,middle);
MergeSort(a,middle+1,right);
Merge(a,b,left,middle,right);
Copy(a,b,left,right);
}
}
template <class T>
void Merge(T a[],T b[],int left,int middle,int right)
{
int k=0,i=0,j=middle;
while(i<middle&&j<right){
if(a[i]<a[j]){
b[k++]=a[i++];
}
else{
b[k++]=a[j++];
}
}
if(i<middle){
while(i<middle)
b[k++]=a[i++];
}
if(j<right){
while(j<right)
b[k++]=a[j++];
}
}
template<class T>
void Copy(T a[],T b[],int left,int right){
int i=0,temp=left-1;
while(i<=right-left){
a[temp++]=b[i++];
}
}
int main()
{
int a[]={10,8,7,5,4,3,2,1};
MergeSort(a,1,8) ;
for(int i=0;i<8;i++){
cout<<a[i]<<" "<<endl;
}
return 0;
}