Проблема с поиском числа инверсий в массиве через алгоритм MergeSort

332
18 декабря 2017, 11:35

Есть рабочий алгоритм 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++];
}

Не могу понять в чем проблема.

READ ALSO
Не меняется тема в приложении Android на axml

Не меняется тема в приложении Android на axml

Пытаюсь убрать верхнюю строку с названием приложения и поменять тему с черной на белую с помощью параметра

199
Всплывающие подсказки с data-hint

Всплывающие подсказки с data-hint

Добрый день, столкнулся с HTML в рамках лабораторной работы, более легкие задания удалось выполнить, а здесь не понимаю, как связать нестандартный...

224
Руководство по изучению JavaScript

Руководство по изучению JavaScript

Пробная версия по написанию книг, в данном случае по языку JavaScriptПодробнее здесь: Как мы хотим начать писать Книги сообщества?

261
Как передать JSON аргументом в nodejs.exec?

Как передать JSON аргументом в nodejs.exec?

Есть библиотека для миграции БД (mongo-migrate - https://githubcom/afloyd/mongo-migrate), она запускается следующей строкой в терминале nodejs: node

230