Рубрики

Java-программа для подсчета инверсий в массиве | Набор 1 (с использованием сортировки слиянием)

Число инверсий для массива указывает — насколько далеко (или близко) массив от сортировки. Если массив уже отсортирован, то счетчик инверсий равен 0. Если массив отсортирован в обратном порядке, то счетчик инверсий является максимальным.
Формально говоря, два элемента a [i] и a [j] образуют инверсию, если a [i]> a [j] и i

Пример:
Последовательность 2, 4, 1, 3, 5 имеет три инверсии (2, 1), (4, 1), (4, 3).

// Java-программа для подсчета
// инверсии в массиве

class Test {

    static int arr[] = new int[] { 1, 20, 6, 4, 5 };

  

    static int getInvCount(int n)

    {

        int inv_count = 0;

        for (int i = 0; i < n - 1; i++)

            for (int j = i + 1; j < n; j++)

                if (arr[i] > arr[j])

                    inv_count++;

  

        return inv_count;

    }

  

    // Метод драйвера для проверки вышеуказанной функции

    public static void main(String[] args)

    {

        System.out.println("Number of inversions are "

                           + getInvCount(arr.length));

    }

}

Выход:

Number of inversions are 5

МЕТОД 2 (Улучшение сортировки слиянием)
Предположим, мы знаем количество инверсий в левой и правой половине массива (пусть это будут inv1 и inv2), какие виды инверсий не учитываются в Inv1 + Inv2? Ответ — инверсии, которые мы должны посчитать на этапе объединения. Поэтому, чтобы получить количество инверсий, нам нужно добавить количество инверсий в левом подмассиве, правом подмассиве и слиянии ().

Джава

// Java-реализация подсчета
// инверсия с использованием сортировки слиянием

  

class Test {

  

    / * Этот метод сортирует входной массив и возвращает

       количество инверсий в массиве * /

    static int mergeSort(int arr[], int array_size)

    {

        int temp[] = new int[array_size];

        return _mergeSort(arr, temp, 0, array_size - 1);

    }

  

    / * Вспомогательный рекурсивный метод, который сортирует входной массив и

      возвращает количество инверсий в массиве. * /

    static int _mergeSort(int arr[], int temp[], int left, int right)

    {

        int mid, inv_count = 0;

        if (right > left) {

            / * Разделите массив на две части и вызовите _mergeSortAndCountInv ()

           для каждой из частей * /

            mid = (right + left) / 2;

  

            / * Счетчик инверсий будет суммой инверсий в левой части, правой части

          и количество инверсий в слиянии * /

            inv_count = _mergeSort(arr, temp, left, mid);

            inv_count += _mergeSort(arr, temp, mid + 1, right);

  

            / * Объединить две части * /

            inv_count += merge(arr, temp, left, mid + 1, right);

        }

        return inv_count;

    }

  

    / * Этот метод объединяет два отсортированных массива и возвращает количество инверсий в

       массивы. * /

    static int merge(int arr[], int temp[], int left, int mid, int right)

    {

        int i, j, k;

        int inv_count = 0;

  

        i = left; / * я индекс для левого подмассива * /

        j = mid; / * j - индекс для правого подмассива * /

        k = left; / * k - индекс для результирующего объединенного подмассива * /

        while ((i <= mid - 1) && (j <= right)) {

            if (arr[i] <= arr[j]) {

                temp[k++] = arr[i++];

            }

            else {

                temp[k++] = arr[j++];

  

                / * это сложно - см. выше объяснение / диаграмма для слияния () * /

                inv_count = inv_count + (mid - i);

            }

        }

  

        / * Копировать оставшиеся элементы левого подмассива

       (если таковые имеются), чтобы временно * /

        while (i <= mid - 1)

            temp[k++] = arr[i++];

  

        / * Копировать остальные элементы правого подмассива

       (если таковые имеются), чтобы временно * /

        while (j <= right)

            temp[k++] = arr[j++];

  

        / * Скопировать обратно объединенные элементы в исходный массив * /

        for (i = left; i <= right; i++)

            arr[i] = temp[i];

  

        return inv_count;

    }

  

    // Метод драйвера для проверки вышеуказанной функции

    public static void main(String[] args)

    {

        int arr[] = new int[] { 1, 20, 6, 4, 5 };

        System.out.println("Number of inversions are " + mergeSort(arr, 5));

    }

}

Выход:

Number of inversions are 5

Пожалуйста, обратитесь к полной статье о инверсии графа в массиве | Установите 1 (используя сортировку слиянием) для более подробной информации!

Рекомендуемые посты:

Java-программа для подсчета инверсий в массиве | Набор 1 (с использованием сортировки слиянием)

0.00 (0%) 0 votes