Рубрики

Программа C для сортировки слиянием

Сортировка слиянием — это алгоритм « разделяй и властвуй» . Он разделяет входной массив на две половины, вызывает себя для двух половинок и затем объединяет две отсортированные половины. Функция merge () используется для объединения двух половинок. Слияние (arr, l, m, r) является ключевым процессом, который предполагает, что arr [l..m] и arr [m + 1..r] отсортированы и объединяет два отсортированных подмассива в один.

C / C ++

/ * C программа для сортировки слиянием * /
#include<stdlib.h>
#include<stdio.h>

  
// Объединяет два подмассива arr [].
// Первый подмассив - это arr [l..m]
// Второй подмассив - это arr [m + 1..r]

void merge(int arr[], int l, int m, int r)

{

    int i, j, k;

    int n1 = m - l + 1;

    int n2 =  r - m;

  

    / * создать временные массивы * /

    int L[n1], R[n2];

  

    / * Копировать данные во временные массивы L [] и R [] * /

    for (i = 0; i < n1; i++)

        L[i] = arr[l + i];

    for (j = 0; j < n2; j++)

        R[j] = arr[m + 1+ j];

  

    / * Объединить временные массивы обратно в arr [l..r] * /

    i = 0; // Начальный индекс первого подмассива

    j = 0; // Начальный индекс второго подмассива

    k = l; // Начальный индекс объединенного подмассива

    while (i < n1 && j < n2)

    {

        if (L[i] <= R[j])

        {

            arr[k] = L[i];

            i++;

        }

        else

        {

            arr[k] = R[j];

            j++;

        }

        k++;

    }

  

    / * Копировать оставшиеся элементы L [], если есть

       любые * /

    while (i < n1)

    {

        arr[k] = L[i];

        i++;

        k++;

    }

  

    / * Скопировать оставшиеся элементы R [], если есть

       любые * /

    while (j < n2)

    {

        arr[k] = R[j];

        j++;

        k++;

    }

}

  
/ * l - левый индекс, а r - правый индекс

   подмассив arr для сортировки * /

void mergeSort(int arr[], int l, int r)

{

    if (l < r)

    {

        // То же, что (l + r) / 2, но избегает переполнения для

        // большие л и ч

        int m = l+(r-l)/2;

  

        // Сортировка первой и второй половин

        mergeSort(arr, l, m);

        mergeSort(arr, m+1, r);

  

        merge(arr, l, m, r);

    }

}

  
/ * ПОЛЕЗНЫЕ ФУНКЦИИ * /
/ * Функция для печати массива * /

void printArray(int A[], int size)

{

    int i;

    for (i=0; i < size; i++)

        printf("%d ", A[i]);

    printf("\n");

}

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

int main()

{

    int arr[] = {12, 11, 13, 5, 6, 7};

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

  

    printf("Given array is \n");

    printArray(arr, arr_size);

  

    mergeSort(arr, 0, arr_size - 1);

  

    printf("\nSorted array is \n");

    printArray(arr, arr_size);

    return 0;

}

Пожалуйста, обратитесь к полной статье о сортировке слиянием для более подробной информации!

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

Программа C для сортировки слиянием

0.00 (0%) 0 votes