C++

[C++] Merger Sort 병합 정렬

Guk-blog 2024. 3. 15. 00:23
728x90
반응형

[병합 정렬의 이점]

- 많은 양의 데이터에 대해 효율적

- 효율 O(Log N)

- 안정적인 정렬 알고리즘

- 데이터의 초기 순서에 관계없이 항상 일정한 성능 제공

[병합 정렬의 단점]

- 메모리를 임시로 저장하기 때문에 메모리 요구량이 크지만, 요즘 사양의 컴퓨터에겐 큰 무리는 없을 수 있다

 

#include <iostream>
#include <vector>

// 두 개의 정렬된 서브 배열을 합병하는 함수
void merge(std::vector<int>& arr, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    // 임시 배열을 생성하고 데이터를 복사합니다.
    std::vector<int> L(n1), R(n2);
    for (int i = 0; i < n1; i++)
        L[i] = arr[left + i];
    for (int j = 0; j < n2; j++)
        R[j] = arr[mid + 1 + j];

    // 두 개의 서브 배열을 합병합니다.
    int i = 0, j = 0, k = left;
    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 left, int right) {
    if (left < right) {
        // 중간 지점을 계산합니다.
        int mid = left + (right - left) / 2;

        // 왼쪽과 오른쪽 서브 배열을 병합 정렬합니다.
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        // 정렬된 서브 배열을 합병합니다.
        merge(arr, left, mid, right);
    }
}

int main() {
    std::vector<int> arr = {12, 11, 13, 5, 6, 7};

    std::cout << "Original array: ";
    for (int num : arr)
        std::cout << num << " ";
    std::cout << std::endl;

    mergeSort(arr, 0, arr.size() - 1);

    std::cout << "Sorted array: ";
    for (int num : arr)
        std::cout << num << " ";
    std::cout << std::endl;

    return 0;
}
728x90
반응형