#include <stdio.h>
void merge_sort(int * arr, int left, int right);
void merge(int * arr, int left, int right, int mid);
void print(int (*arr)[], int length);
int main () {
int arr[] = {2,8,5,43,3,2,6,7,8,1};
int length = sizeof(arr)/sizeof(*arr);
print(&arr, length);
printf("\r\n ");
merge_sort(arr, 0, length -1);
print(&arr, length);
return 0;
}
void print(int (*arr)[], int length){
for(int i = 0; i < length; i++){
printf("%d ", *((*arr) + i) );
}
}
void merge_sort(int * arr, int left, int right){
if( left < right ){
int mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, left, right, mid);
}
}
void merge(int * arr, int left, int right, int mid){
int temp_length = right - left + 1;
int temp[temp_length];
int i, start = left;
while(left <= mid || mid <= right){
if( *(arr + left) < *(arr + mid)){
temp[i++] = *(arr + left);
left++;
}else{
temp[i++] = *(arr + mid);
mid++;
}
}
while( left <= mid){
temp[i++] = *(arr + left);
left++;
}
while(mid <= right){
temp[i++] = *(arr + mid);
mid++;
}
for(int n=0; n < sizeof(temp); n++){
*( arr+ start + n ) = temp[n];
}
}