#include <stdio.h>
int mergeSort(int arr[],int arrStrat,int arrEnd){
int num = 0;
int arrLen = arrEnd - arrStrat;
if(arrLen == 1){
return 0;
}
int mid = arrStrat + arrLen / 2;
num += mergeSort(arr,arrStrat,mid);
num += mergeSort(arr,mid,arrEnd);
return num + merge(arr,arrStrat,mid,arrEnd);
}
int merge(int arr[],int arrStart,int mid,int arrEnd){
int num = 0;
int arrLen = arrEnd - arrStart;
if(arrLen < 2){
return 0;
}
int i = arrStart;
int j = mid;
int tempIndex = 0;
int temp[arrLen];
while (i < mid && j < arrEnd) {
if (arr[i] > arr[j]) {
temp[tempIndex] = arr[j];
++j;
num += (mid - i);
}
else {
temp[tempIndex] = arr[i];
++i;
}
++tempIndex;
}
while (i < mid) {
temp[tempIndex++] = arr[i++];
}
while (j < arrEnd) {
temp[tempIndex++] = arr[j++];
}
for (tempIndex = 0, i = arrStart;tempIndex < arrLen && i < arrEnd;tempIndex++, i++) {
arr[i] = temp[tempIndex];
}
return num;
}
void printArray(int arr[], int arrLen) {
for (int i = 0; i < arrLen; ++i) {
printf("%d ",arr[i]);
}
}
int main () {
int arr[] = {3,1,2,4,5,6};
int flag = mergeSort(arr,0,sizeof(arr)/sizeof(int));
printf("%d\n",flag);
printArray(arr,sizeof(arr)/sizeof(int));
return 0;
}