Merge Sort 는 유명한 정렬 알고리즘 중에 하나입니다.
최악의 시간복잡도가 O(n log n)라는 점 때문에 실제 알고리즘 문제에서도 많이 사용됩니다.
stable sort(안정 정렬, 같은 우선순위의 값에 대해 정렬 전후 순서 동일) , 메모리가 2배로 든다는 점이 특징입니다.
다른 개념적인 설명은 뒤로하고 여기선 오로지 외워서 사용하기 편한 방법을 하나 소개합니다.
톱다운으로 구현한 방법입니다.
#include <iostream>
#define MAX 10
int tmp[MAX];
using namespace std;
void mergeSort(int arr[], int s, int e)
{
//base condition
if (s >= e) return;
//divide
int m = (s + e) / 2;
//conquer
mergeSort(arr, s, m);
mergeSort(arr, m + 1, e);
//combine
int idx1 = s, idx2 = m + 1, k=s;
while ((idx1 <= m) && (idx2 <= e)) {
if (arr[idx1] < arr[idx2]) tmp[k++] = arr[idx1++];
else tmp[k++] = arr[idx2++];
}
while (idx1 <= m) tmp[k++] = arr[idx1++];
while (idx2 <= e) tmp[k++] = arr[idx2++];
//copy
for (int i = s; i <= e; i++) arr[i] = tmp[i];
}
void printArr(int arr[]) {
for (int i = 0; i < MAX; i++)cout << arr[i]<<" ";
cout << "\n";
}
int main()
{
int arr[MAX] = { 3,5,2,1,9,0,7,6,8,4 };
cout << "origin : ";
printArr(arr); //3 5 2 1 9 0 7 6 8 4
mergeSort(arr,0,9);
cout << "sorted : ";
printArr(arr); //0 1 2 3 4 5 6 7 8 9
return 0;
}
'Algorithm > 개념 (Concept)' 카테고리의 다른 글
최소 신장 트리 (MST , Minium Spanning Tree) (0) | 2020.05.25 |
---|---|
빅-오 표기법 (Big-Oh Natation), 시간 복잡도(Time Complexity) (0) | 2020.05.14 |
[C++,DP] 백준 1463번 1로 만들기 문제풀이, DP와 분할정복의 특징 (0) | 2019.02.26 |
댓글