#include <iostream>
using namespace std;
bool merge(int arr[], int l, int mid, int r){
int len = r - l;
if(len < 2) return false;
int* tmp = new int(len);
int i = l, j = mid;
int idx = 0;
while(i < mid && j < r){
if(arr[i] > arr[j]){
tmp[idx++] = arr[j++];
}else{
tmp[idx++] = arr[i++];
}
}
while(i < mid) tmp[idx++] = arr[i++];
while(j < r) tmp[idx++] = arr[j++];
for(int idx = 0, i = l; i < r && idx < len; i++, idx++){
arr[i] = tmp[idx];
}
return true;
}
bool mergeSort(int arr[], int l, int r){
if((r - l) <= 1) return true;
int mid = l + r >> 1;
mergeSort(arr, l, mid);
mergeSort(arr, mid, r);
return merge(arr, l,mid, r);
}
void Print(int a[], int end){
for(int i = 0; i < end; i++){
cout << a[i] << " ";
}
cout << endl;
}
int main() {
int arr[] = {2, 4, 1, 7, 8, 3, 5, 9};
int len = sizeof(arr)/sizeof(int);
mergeSort(arr, 0, len);
Print(arr, len);
return 0;
}