본문으로 바로가기

Merge Sort

void merge(int arr[], int left, int mid, int right){
int i = left;
int j = mid+1;
int idx = left;
while(i <= mid && j <= right){
if(arr[i] < arr[j]){
outPlace[idx] = arr[i];
++idx;
++i;
}else{
outPlace[idx] = arr[j];
++idx;
++j;
}
}
if(i > mid){
while(j <= right){
outPlace[idx] = arr[j];
++idx;
++j;
}
}else{
while(i <= mid){
outPlace[idx] = arr[i];
++idx;
++i;
}
}
idx = left;
while(idx <= right){
arr[idx] = outPlace[idx];
++idx;
}
}
void mergeSort(int arr[], int left, int right){
if(left < right){
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid+1, right);
merge(arr, left, mid, right);
}
}
  • 머지 소트는 분할 정복 방식의 O(n logn) 속도를 지닌 빠른 정렬 기법이다.
  • 퀵정렬에 비해 다소 느리지만, 퀵정렬과 다르게 항상 n log n 의 시간복잡도를 지니는 장점이 있다.
  • merge 함수는 n 시간이 소요되며, 이때 새로운 배열에 기존 요소들을 정렬하며 담고, 마지막에 원래 배열로 복사가 이루어진다.
  • 따라서 시간 복잡도에 비해 메모리 지역성이 다소 떨어지고 추가 메모리 공간이 필요하다.
  • mergeSort 함수는 배열을 계속해서 반으로 나누는 분할 과정이고 log n 시간이 소요된다.
  • 앞 서 언급한대로 추가 배열이 필요하기 때문에 2n 만큼이지만 빅오 표기법상 O(n)이라 할 수 있다.
  • 이를 응용하면, 외부 병합 정렬을 이용할 수 있다.
  • out of place 기법이다. ( in place로도 할 수는 있다고 한다. )

CS 공부Algorithm, Data Structure (재정리)카테고리의 다른글

MST, 최소신장트리  (0) 2021.04.11
Heap Sort 및 Heap  (0) 2021.04.07
Quick Sort  (0) 2021.04.07
Binary Tree  (0) 2021.04.07
Stack, Queue  (0) 2021.04.06