반응형
병합 정렬(Merge Sort)
병합 정렬이란?
- 분할 정복(divide and conquer) 알고리즘 디지인 기법에 근거하여 만들어진 정렬 방법.
- 데이터가 1개 남을 때까지 분할하고, 분할된 데이터를 정렬한 후 다시 결합한다.
- 실제 정렬은 분할하는 과정이 아니라, 병합하는 과정에서 이루어진다.
- 병합 정렬은 O(nlogn)의 시간복잡도를 가진다.
- 병합 정렬은 임시 메모리가 필요하다는 단점이 존재한다.
병합 정렬 예시(오름차순)
병합 정렬의 정렬&결합 과정
- 결합하는 두 데이터는 모두 정렬되어 있다.
- 처음부터 하나씩 비교하여 임의의 데이터 공간에 저장한다.
병합 정렬 코드(C++)
#include <iostream>
#include <vector>
using namespace std;
void MergeData(vector<int> &vec, int left, int mid, int right)
{
int firstIndex = left;
int secondIndex = mid + 1;
int i;
int tmpIndex = left;
// 정렬을 위한 공간 미리 선언 필요
vector<int> tmp(vec.size());
// 인덱스를 증가해 가면서 값을 비교하고, 데이터에 넣는다.
while (firstIndex <= mid && secondIndex <= right)
{
if (vec[firstIndex] <= vec[secondIndex])
{
tmp[tmpIndex] = vec[firstIndex];
firstIndex++;
}
else
{
tmp[tmpIndex] = vec[secondIndex];
secondIndex++;
}
tmpIndex++;
}
// 첫 번째 데이터에 있는 값만 다 옮긴 경우
if (firstIndex > mid)
{
// 두 번째 데이터에 있는 값을 그대로 옮긴다.
for (int i = secondIndex; i <= right; i++, tmpIndex++)
{
tmp[tmpIndex] = vec[i];
}
}
// 두 번째 데이터에 있는 값만 다 옮긴 경우
else
{
// 첫 번째 데이터에 있는 값을 그대로 옮긴다.
for (int i = firstIndex; i <= mid; i++, tmpIndex++)
{
tmp[tmpIndex] = vec[i];
}
}
// 정렬된 데이터 복사.
for (int i = left; i <= right; i++)
{
vec[i] = tmp[i];
}
}
void MergeSort(vector<int> &vec, int left, int right)
{
int mid;
// 분할 가능한 경우
if (left < right)
{
mid = (left + right) / 2;
// left ~ mid에 위치한 데이터를 정렬한다.
MergeSort(vec, left, mid);
// mid+1 ~ right에 위치한 데이터를 정렬한다.
MergeSort(vec, mid+1, right);
// 정렬한 데이터를 병합한다.
MergeData(vec, left, mid, right);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<int> vec{ 7,1,8,3,5,2};
cout << "정렬 전 : ";
for (auto i : vec)
cout << i << ", ";
cout << endl;
// right에는 크기가 아니라, 마지막 인덱스 값 전달.
MergeSort(vec,0,vec.size()-1);
cout << "정렬 후 : ";
for (auto i : vec)
cout << i << ", ";
cout << endl;
return 0;
}
반응형
'알고리즘 > 알고리즘 이론' 카테고리의 다른 글
유니온 파인드(Union - Find) (0) | 2020.06.17 |
---|---|
정렬 알고리즘 - 퀵 정렬(Quick Sort) (0) | 2020.06.16 |
정렬 알고리즘 - 삽입 정렬(Insertion Sort) (0) | 2020.06.14 |
정렬 알고리즘 - 선택 정렬(Selection Sort) (0) | 2020.06.11 |
정렬 알고리즘 - 버블 정렬(Bubble Sort) (0) | 2020.06.08 |
댓글