//
// main.cpp
// mergesort
//
// Created by lingnan on 10/21/15.
// Copyright (c) 2015 lingnan. All rights reserved.
//
#include <iostream>
using namespace std;
void merge(int arr[], int left, int mid, int right){
int n1 = mid - left +1;
int n2 = right - mid;
int a1[n1], a2[n2];
for(int i=0; i<n1; i++){
a1[i] = arr[left+i];
}
for(int j=0; j<n2; j++){
a2[j] = arr[mid+j+1];
}
int c_a= 0;
int c_b = 0;
int c = left;
while(c_a <n1 && c_b <n2){
if(a1[c_a] <= a2[c_b]){
arr[c++] = a1[c_a++];
}else{
arr[c++] = a2[c_b++];
}
}
while(c_a <n1){
arr[c++] = a1[c_a++];
}
while(c_b <n2){
arr[c++] = a2[c_b++];
}
}
void mergesort(int arr[], int left, int right){
if(left < right){
int mid = (right - left)/2 + left;
mergesort(arr, left, mid);
mergesort(arr, mid+1, right);
merge(arr, left, mid, right);
}
}
void printArray(int arr[], int n){
cout<<"The final result after mergesort is:"<<endl;
for(int i=0; i<n;i++) {
cout<< arr[i] <<" ";
}
}
int main(int argc, const char * argv[]) {
int arr[] = {3,21,5,3,2,5,3,6,454,7,3,63,4,645};
int n = sizeof(arr)/sizeof(arr[0]);
mergesort(arr, 0, n-1);
printArray(arr, n);
return 0;
}