Сортировка слиянием в C++: реализация и объяснение на примере кода

Вот пример алгоритма сортировки слиянием, реализованного на C++:

#include <iostream>
using namespace std;
void merge(int arr[], int left[], int leftSize, int right[], int rightSize) {
    int i = 0, j = 0, k = 0;

    while (i < leftSize && j < rightSize) {
        if (left[i] <= right[j]) {
            arr[k] = left[i];
            i++;
        } else {
            arr[k] = right[j];
            j++;
        }
        k++;
    }

    while (i < leftSize) {
        arr[k] = left[i];
        i++;
        k++;
    }

    while (j < rightSize) {
        arr[k] = right[j];
        j++;
        k++;
    }
}
void mergeSort(int arr[], int size) {
    if (size < 2)
        return;

    int mid = size / 2;
    int left[mid];
    int right[size - mid];

    for (int i = 0; i < mid; i++)
        left[i] = arr[i];

    for (int i = mid; i < size; i++)
        right[i - mid] = arr[i];

    mergeSort(left, mid);
    mergeSort(right, size - mid);
    merge(arr, left, mid, right, size - mid);
}
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}
int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int size = sizeof(arr) / sizeof(arr[0]);

    cout << "Original array: ";
    printArray(arr, size);

    mergeSort(arr, size);

    cout << "Sorted array: ";
    printArray(arr, size);

    return 0;
}

Объяснение:

  • Функция merge()используется для объединения двух отсортированных подмассивов в один отсортированный массив.
  • Функция mergeSort()рекурсивно делит массив на две половины, сортирует их с помощью сортировки слиянием, а затем снова объединяет.
  • Функция printArray()используется для печати элементов массива.