#include <iostream>
#include <math.h>
using namespace std;
int mergeReveredOrder(int array[], int arrStart, int arrMiddle, int arrEnd) {
int num = 0;
int arrLen = arrEnd - arrStart;
if (arrLen < 2) {
cout << "Please check your implementation." << endl;
return 0;
}
int *temp = new int(arrLen);
int i = arrStart;
int j = arrMiddle;
int tempIndex = 0;
while (i < arrMiddle && j < arrEnd) {
if (array[i] > array[j]) {
temp[tempIndex] = array[j];
++j;
num += (arrMiddle - i);
}
else {
temp[tempIndex] = array[i];
++i;
}
++tempIndex;
}
while (i < arrMiddle) {
temp[tempIndex++] = array[i++];
}
while (j < arrEnd) {
temp[tempIndex++] = array[j++];
}
for ((tempIndex = 0, i = arrStart); (tempIndex < arrLen && i < arrEnd); (++tempIndex, ++i)) {
array[i] = temp[tempIndex];
}
delete []temp;
temp = NULL;
return num;
}
int countReversedOrder(int array[], int arrStart, int arrEnd) {
int arrLen = arrEnd - arrStart;
if (arrLen < 0) {
cout << "Please check your input." << endl;
return false;
}
int num = 0;
if (arrLen == 0 || arrLen == 1) {
return 0;
}
int middle = arrStart + floor(arrLen / 2);
num += countReversedOrder(array, arrStart, middle);
num += countReversedOrder(array, middle, arrEnd);
return num + mergeReveredOrder(array, arrStart, middle, arrEnd);
}
int main(){
int array0[] = {};
int arrayLen = sizeof(array0)/sizeof(int);
cout << "The amount of reversed order is " << countReversedOrder(array0, 0, arrayLen) << endl;
cout << "=========================================" << endl;
int array1[] = {1};
arrayLen = sizeof(array1)/sizeof(int);
cout << "The amount of reversed order for {1} is " << countReversedOrder(array1, 0, arrayLen) << endl;
cout << "=========================================" << endl;
int array2[] = {2, 1};
arrayLen = sizeof(array2)/sizeof(int);
cout << "The amount of reversed order for {2, 1} is " << countReversedOrder(array2, 0, arrayLen) <<endl;
cout << "=========================================" << endl;
int array3[] = {1, 5, 3};
arrayLen = sizeof(array3)/sizeof(int);
cout << "The amount of reversed order for {1, 5, 3} is " << countReversedOrder(array3, 0, arrayLen) <<endl;
cout << "=========================================" << endl;
int array4[] = {9, 12, 8, 7};
arrayLen = sizeof(array4)/sizeof(int);
cout << "The amount of reversed order for {9, 12, 8, 7} is " << countReversedOrder(array4, 0, arrayLen) <<endl;
cout << "=========================================" << endl;
int array5[] = {2, 4, 3, 1, 5,6};
arrayLen = sizeof(array5)/sizeof(int);
cout << "The amount of reversed order for {2, 4, 3, 1, 5,6} is " << countReversedOrder(array5, 0, arrayLen )<<endl;
}