코딩테스트/알고리즘 정리

[Week1] 병합 정렬 (MergeSort)

까루카라 2024. 1. 31. 09:16

병합 정렬 (Merge Sort)

 

정의

합병 정렬이라고도 부르며, 분할 정복 방법을 통해 구현

 

※ 분할 정복 (divide and conquer)
   문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략

 



빠른 정렬로 분류되며, 퀵 정렬과 함께 많이 언급되는 정렬 방식이다. 

안정 정렬에 속한다. 

 

퀵 정렬과의 차이점
퀵 정렬 : 우선 피벗을 통해 정렬 (partition) → 영역을 쪼갬(quickSort)
병합 정렬 : 영역을 쪼갤 수 있을 만큼 쪼갬(mergeSort) → 정렬(merge)

 

Process

static void mergeSort(int[] array, int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(array, left, mid);
        mergeSort(array, mid + 1, right);

        merge(array, left, mid, right);
    }
}

 

요소를 쪼갠 후, 정렬

 

 

이미 합병의 대상이 되는 두 영역이 각 영역에 대해서 정렬이 되어있기 때문에 단순히 두 배열을 순차적으로 비교하면서 정렬할 수 있다. 

정렬 과정에서 한 배열이 모두 소진되었으면 나머지는 그대로 배열에 넣어줌

 

합병 정렬은 순차적인 비교로 정렬을 진행하므로 LinkedList의 정렬이 필요할 때 사용하면 효율적이다. 
(퀵 정렬은 임의 접근이기 때문에 비효율적임)

 

 

시간복잡도

평균 최선 최악
Θ(nlogn) Ω(nlogn) O(nlogn)