Есть рабочий алгоритм MergeSort. Нужно модифицировать его так, чтобы он по совместительству находил и число инверсий в массиве.
Инверсией считается пара чисел массива, если выполняется условие A[left] > A[right]. И так же все оставшиеся элементы левой части тоже будут больше, т.к. левая и правая часть отсортированы. Поэтому количество инверсий нужно увеличить на количество оставшихся элементов + 1 (текущий элемент).
Проблема заключается в том, что, например, в таком наборе чисел «145, 179, 232, 307, 588, 792, 22, 233, 279, 336, 863, 866» кол-во инверсий равно числу 14, а на выводе 15. Хотя при другом наборе, например, «1, 5, 8, 3, 7, 10» выводит правильное число, это 3.
Вот моя наработка:
public static void MargeSort(int[] array, int l, int r)
{
if ((r - l) < 2)
return;
MargeSort(array, l, (l + r) / 2);
MargeSort(array, (l + r) / 2, r);
Marge(array, l, r);
}
private static int inversionsCount = 0;
public static void Marge(int[] array, int l, int r)
{
int middle = (l + r) / 2;
int left = l;
int right = middle;
int index = 0;
int[] buff = new int[r - l];
while ((left < middle) && (right < r))
{
if (array[left] > array[right])
{
buff[index++] = array[left++];
// здесь идет подсчет кол-ва инверсий
inversionsCount += middle - left;
}
else buff[index++] = array[right++];
}
while (left < middle)
buff[index++] = array[left++];
while (right < r)
buff[index++] = array[right++];
index = 0;
while (index < buff.Length)
array[l + index] = buff[index++];
}
Не могу понять в чем проблема.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости