반응형
합병 정렬 (Merge Sort)
합병 정렬은 분할 정복(Divide and Conquer) 기법을 사용하는 효율적인 정렬 알고리즘입니다. 배열을 반으로 나누어 각각을 정렬한 후, 두 개의 정렬된 배열을 하나의 정렬된 배열로 합병하는 과정을 반복합니다.
합병 정렬의 시간 복잡도:
- 평균의 경우: (O(n \log n))
- 최악의 경우: (O(n \log n))
- 최선의 경우: (O(n \log n))
합병 정렬의 공간 복잡도:
- (O(n))
합병 정렬 구현
합병 정렬의 주요 단계:
- 분할 (Divide): 배열을 두 개의 하위 배열로 분할합니다.
- 정복 (Conquer): 하위 배열을 재귀적으로 정렬합니다.
- 합병 (Combine): 두 개의 정렬된 하위 배열을 하나의 정렬된 배열로 합병합니다.
합병 정렬의 구현 코드
#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);
std::vector<int> 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 << "정렬 전 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
mergeSort(arr, 0, arr.size() - 1);
std::cout << "정렬 후 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
설명
- 병합 함수 (Merge Function):
- 두 개의 정렬된 하위 배열을 하나의 정렬된 배열로 합병합니다.
L
과R
배열을 사용하여 좌측 및 우측 하위 배열을 저장합니다.L
과R
배열의 요소를 비교하여 원래 배열에 다시 합병합니다.
- 합병 정렬 함수 (Merge Sort Function):
- 배열을 재귀적으로 반으로 분할합니다.
- 각 하위 배열을 정렬한 후 병합합니다.
합병 정렬의 기본 개념과 구현 방법을 이해했습니다. 다음 단계로 넘어가며, 더 복잡한 정렬 알고리즘과 다양한 알고리즘을 학습해보겠습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 19: 퀵 정렬"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++로 배우는 알고리즘과 자료구조 시리즈' 카테고리의 다른 글
[C++로 배우는 알고리즘과 자료구조] Day 20: 힙 정렬 (Heap Sort) (0) | 2024.08.01 |
---|---|
[C++로 배우는 알고리즘과 자료구조] Day 21: 기수 정렬과 계수 정렬 (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 19: 퀵 정렬 (Quick Sort) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 16: 버블 정렬과 선택 정렬 (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 17: 삽입 정렬과 쉘 정렬 (0) | 2024.08.01 |