반응형
병합정렬(Merge Sort)은 분할 정복(divide and conquer) 알고리즘 중 하나로,
주어진 배열을 반으로 나누고, 각 부분 배열을 재귀적으로 정렬하며,
정렬된 부분 배열을 병합하여 전체 배열을 정렬하는 방식입니다.
아래는 병합정렬의 구체적인 과정입니다.
- 주어진 배열을 반으로 나눕니다. 이때, 배열의 크기가 1 이하가 될 때까지 계속해서 반으로 나누어줍니다.
- 각 부분 배열을 정렬합니다. 이때, 재귀적으로 정렬을 수행합니다.
- 정렬된 부분 배열을 병합합니다. 병합할 때는 각 부분 배열의 첫번째 원소를 비교하여 작은 값부터 새로운 배열에 추가해줍니다.
- 전체 배열이 정렬될 때까지 위 과정을 반복합니다.
아래는 C++ 코드로 구현한 병합정렬 예시입니다.
#include <iostream>
#include <vector>
using namespace std;
void merge_sort(int s, int e);
static vector<int> A;
static vector<int> tmp;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
A = vector<int>(N + 1, 0);
tmp = vector<int>(N + 1, 0);
for (int i = 1; i <= N; i++)
cin >> A[i];
result = 0;
merge_sort(1, N);
for (int i = 1; i < A.size(); i++)
cout << A[i] << " ";
}
void merge_sort(int start, int end)
{
if (end - start < 1) return;
int mid = start + (end - start) / 2;
merge_sort(start, mid);
merge_sort(mid + 1, end);
for (int i = start; i <= end; i++)
tmp[i] = A[i];
int k = start;
int i = start;
int j = mid + 1;
while (i <= mid && j <= end)
{
if (tmp[i] > tmp[j])
{
A[k] = tmp[j];
k++;
j++;
}
else
{
A[k] = tmp[i];
k++;
i++;
}
}
while (i <= mid)
A[k++] = tmp[i++];
while (j <= end)
A[k++] = tmp[j++];
}
위 코드에서 merge_sort 함수는 주어진 배열을 두 부분으로 나누고,
각 부분 배열을 재귀적으로 정렬한 뒤, merge 함수를 호출하여 두 부분 배열을 병합합니다.
merge 함수에서는 각 부분 배열의 첫번째 원소를 비교하여 작은 값부터 새로운 배열에 추가합니다.
이러한 과정을 반복하여 전체 배열이 정렬된 결과를 반환합니다.
반응형
LIST
'프로그래밍 > 자료구조와 알고리즘' 카테고리의 다른 글
유클리드 호제법 (0) | 2024.03.28 |
---|---|
오일러 피 함수 (0) | 2024.03.28 |
선택정렬 (0) | 2023.02.15 |
우선순위 큐 (0) | 2023.02.15 |
2차원 배열 누적합 (0) | 2023.01.31 |