Ваши рекурсивные вызовы с влево * до середины и в середине + 1 вправо , как показано здесь:
count = _mergeSort(arr, temp, left, mid);
count += _mergeSort(arr, temp, mid+1, right);
Следовательно, правильный вызов функции слияния должен быть:
count += merge(arr, temp, left, mid, right);
Есть также некоторые ошибки в определении слияния. Позвольте мне указать вам на них:
x
должно варьироваться от left
до mid
. у должен варьироваться от mid+1
до right
x = left; /* i is index for left subarray*/
y = mid+1; /* j is index for right subarray*/
z = left; /* k is index for resultant merged subarray*/
while ((x <= mid) && (y <= right))
Также счет инверсии на самом деле равен count = count + (mid - x) + 1; . Вы можете понять это, взяв небольшой массив из 5 элементов.
Также индексы для температуры всегда начинаются с 0 .
Следовательно, правильная функция слияния:
static int merge(Integer arr[], int temp[], int left, int mid, int right)
{
int x, y, z ;
int count = 0;
x = left; /* i is index for left subarray*/
y = mid+1; /* j is index for right subarray*/
z = 0; /* k is index for resultant merged subarray*/
while ((x <= mid) && (y <= right))
{
if (arr[x] <= arr[y])
{
temp[z++] = arr[x++];
}
else
{
temp[z++] = arr[y++];
count = count + (mid - x) + 1;
}
}
/* Copy the remaining elements of left subarray
(if there are any) to temp*/
while (x <= mid)
temp[z++] = arr[x++];
/* Copy the remaining elements of right subarray
(if there are any) to temp*/
while (y <= right)
temp[z++] = arr[y++];
/*Copy back the merged elements to original array*/
z = 0;
for (x=left; x <= right; x++)
arr[x] = temp[z++];
return count;
}