1. 설명

  • 분할 정복(Divide and Conquer) 알고리즘
  • 배열을 반씩 나누고 정렬한 후 병합하는 방식
  • 시간복잡도는 항상 O(n log n)
  • 대량 데이터에 적합하지만 추가적인 메모리 공간 사용

2. 코드

#include <iostream>
#include <vector>

using namespace std;

void merge(vector<int>& arr, int left, int mid, int right) {
    vector<int> leftArr(arr.begin() + left, arr.begin() + mid + 1);
    vector<int> rightArr(arr.begin() + mid + 1, arr.begin() + right + 1);

    int i = 0, j = 0, k = left;
    while (i < leftArr.size() && j < rightArr.size()) {
        if (leftArr[i] <= rightArr[j]) arr[k++] = leftArr[i++];
        else arr[k++] = rightArr[j++];
    }

    while (i < leftArr.size()) arr[k++] = leftArr[i++];
    while (j < rightArr.size()) arr[k++] = rightArr[j++];
}

void mergeSort(vector<int>& arr, int left, int right) {
    if (left >= right) return;
    
    int mid = left + (right - left) / 2;
    mergeSort(arr, left, mid);
    mergeSort(arr, mid + 1, right);
    merge(arr, left, mid, right);
}

int main() {
    vector<int> arr = {64, 25, 12, 22, 11};
    mergeSort(arr, 0, arr.size() - 1);

    for (int num : arr) cout << num << " ";
}

 

'Algorithm' 카테고리의 다른 글

[프로그래머스] 부족한 금액 계산하기  (0) 2025.03.10
[프로그래머스] 문자열 내림차순으로 배치하기  (0) 2025.03.10
[정렬] 퀵 정렬  (0) 2025.03.10
[정렬] 삽입 정렬  (0) 2025.03.10
[정렬] 선택 정렬  (0) 2025.03.10

+ Recent posts