[c++] 반복 합병 정렬

반복 합병 정렬은 합병 정렬을 반복문을 사용하여 구현한 정렬 알고리즘입니다. 이 알고리즘은 입력 크기에 관계없이 안정적이고 빠른 성능을 제공합니다.

알고리즘 설명

다음은 반복 합병 정렬의 간단한 설명입니다.

  1. 주어진 배열을 크기가 1인 작은 단위 배열로 분할합니다.
  2. 분할한 배열들을 순서대로 합병하여 크기가 2배씩 증가하는 정렬된 배열을 생성합니다.
  3. 이전 단계에서 생성한 정렬된 배열을 다시 크기가 2배씩 증가하는 정렬된 배열로 합병합니다. 이 과정을 반복하여 최종적으로 하나의 정렬된 배열을 생성합니다.

C++ 코드 예시

#include <iostream>
#include <vector>

void merge(std::vector<int>& arr, int l, int m, int r) {
    int n1 = m - l + 1;
    int n2 = r - m;

    std::vector<int> L(n1), R(n2);
    for (int i = 0; i < n1; i++) {
        L[i] = arr[l + i];
    }
    for (int j = 0; j < n2; j++) {
        R[j] = arr[m + 1 + j];
    }

    int 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++;
    }

    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }

    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

void mergeSort(std::vector<int>& arr) {
    int n = arr.size();
    for (int currSize = 1; currSize <= n - 1; currSize = 2 * currSize) {
        for (int leftStart = 0; leftStart < n - 1; leftStart += 2 * currSize) {
            int mid = std::min(leftStart + currSize - 1, n - 1);
            int rightEnd = std::min(leftStart + 2 * currSize - 1, n - 1);
            merge(arr, leftStart, mid, rightEnd);
        }
    }
}

int main() {
    std::vector<int> arr = {12, 11, 13, 5, 6, 7};
    int arrSize = arr.size();
    mergeSort(arr);
    std::cout << "Sorted array: ";
    for (int i = 0; i < arrSize; i++) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

참고 자료

이와 같이 반복 합병 정렬은 입력된 배열을 효과적으로 정렬할 수 있는 강력한 알고리즘입니다.