Рубрики

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

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

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

// C программа для подсчета
// Инверсии в массиве
#include <bits/stdc++.h>

int getInvCount(int arr[], 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;

}

  
/ * Драйвер программы для проверки вышеуказанных функций * /

int main(int argv, char** args)

{

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

    int n = sizeof(arr) / sizeof(arr[0]);

    printf(" Number of inversions are %d \n", getInvCount(arr, n));

    return 0;

}

Выход:

Number of inversions are 5

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

С

// C программа для подсчета
// Инверсии в массиве
// используя сортировку слиянием
#include <bits/stdc++.h>

  

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

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

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

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

int mergeSort(int arr[], int array_size)

{

    int* temp = (int*)malloc(sizeof(int) * array_size);

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

}

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

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

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;

}

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

   массивы. * /

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;

}

  
/ * Программа драйвера для проверки вышеуказанных функций * /

int main(int argv, char** args)

{

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

    printf(" Number of inversions are %d \n", mergeSort(arr, 5));

    getchar();

    return 0;

}

Выход:

Number of inversions are 5

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

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

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

0.00 (0%) 0 votes