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
반응형