합병 정렬이란 ?
합병? 병합? 둘 다 사용해도 되는 정렬 이름이다.
- 합병 : A와 B가 합쳐져서 C가 만들어진다.
- 병합 : A가 B의 일부가 되거나? B가 A의 일부가 됨.
분할을 이용하는 분할 정복 알고리즘이다.
말 그대로인 배열을 쪼개서 길이가 1인 배열을 만들고, 그 이후 정렬하면서 합치는 정렬이다.
합병은 binary tree 형태로 쪼개지기 때문에 가질 수 있는 최대 깊이는 log N이 된다.
병합 정렬의 단계가 존재하는데,
'분할, 정복, 결합' 3가지로 나누어 볼 수가 있다.
분할 단계 : 입력된 배열을 같은 크기의 2개의 부분 배열로 분할한다.
정복 단계 : 부분 배열을 정렬한다. (*여기서 부분 배열의 크기가 충분히 작지 않다면? '순환 호출'을 이용하여 다시 분할 정복법을 적용한다)
결합 단계 : 정렬된 부분 배열을 다시 하나의 배열로 결합한다.
* 단순히 중간 인덱스를 찾아야하는 분할 비용보다 모든 값들을 비교해야하는 병합 비용이 크다.
병합 정렬 장단점은 ?
장점 :
1. 데이터 분포에 영향을 덜 받는다. 즉, 입력 데이터가 크던 작던 정렬되는 시간은 동일하다 [O(nlogN)으로 동일]
2. 만약 레코드를 LinkedList 로 구성하면, Link Index 만 변경되므로 데이터의 이동은 무시할 수 있을 정도로 작아진다. 즉, 어떠한 정렬 방법보다도 LinkedList 를 사용한 합병정렬 효율이 뛰어나다.
단점 :
1. 레코드를 배열(Array)로 구성하면, 임시 배열이 필요하다 (제자리 정렬이 아니다)
2. 레코드들의 크기가 큰 경우에는 이동 횟수가 많아지므로 매우 시간 복잡도가 올라간다.
시간 복잡도는 ?
분할 단계 => 비교연산이나 이동연산이 수행되지 않는다. O(nlogN)
병합 단계(정복+결합) => 순환 호출의 깊이 만큼 합병단계 * 각 합병 단계의 이동연산 시. O(2nlogN)
따라서, O(3nlogN) = O(nlogN) 이다.
'CS > Datastructure & Algorithm' 카테고리의 다른 글
힙 정렬 (Heap Sort) 이란? (0) | 2022.03.13 |
---|---|
퀵 정렬 (Quick Sort) 란? (0) | 2022.03.13 |
셸 (Shell Sort) 정렬 란? (0) | 2022.03.13 |
삽입 정렬(Insertion Sort) 란? (0) | 2022.03.13 |
선택 정렬 (Selection Sort) 란? (0) | 2022.03.13 |