병합 정렬(Merge Sort)은 1945년 존 폰 노이만이 고안한 비교 기반 정렬 알고리즘이다. 분할 정복(Divide and Conquer) 전략을 사용하여 정렬되지 않은 리스트를 원소가 하나인 부분 리스트로 나눈 뒤, 이를 다시 정렬하며 합치는 방식으로 작동한다. 데이터의 상대적 순서가 유지되는 안정 정렬이며, 데이터 분포와 상관없이 일정한 성능을 보장하는 것이 특징이다.

배너 광고

개요

병합 정렬은 정렬되지 않은 리스트를 원소가 하나인 부분 리스트로 분할한 뒤, 이를 다시 정렬하며 병합하여 최종적인 정렬 리스트를 만드는 방식이다. 1945년 존 폰 노이만에 의해 고안되었으며, 1948년 헤르만 골드스타인과 폰 노이만의 보고서를 통해 상향식 병합 정렬에 대한 상세한 분석이 공개되었다. 이 알고리즘은 데이터의 크기가 커져도 성능이 일정하게 유지되는 장점이 있다.

알고리즘 단계

일반적으로 사용되는 하향식(Top-down) 2-way 병합 정렬은 다음과 같은 과정을 거친다.

  1. 분할(Divide): 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다. 리스트의 길이가 1 이하가 될 때까지 반복한다.
  2. 정복(Conquer): 각 부분 리스트를 재귀적으로 병합 정렬을 이용해 정렬한다.
  3. 결합(Combine/Merge): 정렬된 두 부분 리스트를 비교하여 하나의 정렬된 리스트로 합친다. 이때 결과는 임시 배열에 저장된다.
  4. 복사(Copy): 임시 배열에 저장된 정렬 결과를 원래의 배열로 복사한다.

상향식(Bottom-up) 방식은 재귀 없이 반복문을 사용하여 작은 크기의 부분 리스트부터 시작하여 점차 병합해 나가는 방식을 취한다.

병합 과정의 예시

배열 [6, 5, 3, 1]을 오름차순으로 정렬하는 과정은 다음과 같다.

단계과정상태
분할리스트를 절반으로 나눔[6, 5], [3, 1]
최소 분할원소가 하나가 될 때까지 나눔[6], [5], [3], [1]
1차 병합인접한 원소를 비교하며 병합[5, 6], [1, 3]
최종 병합두 리스트의 앞부분부터 비교하며 병합[1, 3, 5, 6]

최종 병합 시에는 각 부분 리스트의 첫 번째 원소를 비교하여 더 작은 값을 선택해 결과 배열에 넣는 과정을 반복한다.

주요 특징

  • 안정 정렬(Stable Sort): 동일한 값을 가진 원소들의 상대적인 순서가 정렬 후에도 변하지 않는다.
  • 시간 복잡도: 최선, 평균, 최악의 경우 모두 O(nlogn)O(n \log n)의 성능을 보인다. 이는 데이터의 초기 정렬 상태에 영향을 받지 않음을 의미한다.
  • 공간 복잡도: 정렬 과정에서 정렬된 결과를 담을 추가적인 임시 배열이 필요하므로 O(n)O(n)의 공간 복잡도를 가진다. 이를 제자리 정렬(In-place sort)이 아닌 외적 정렬(Out-of-place sort) 방식이라고 한다.
  • 데이터 접근: 연결 리스트(Linked List) 정렬에 매우 효율적이다. 연결 리스트는 임의 접근이 어렵지만 병합 정렬은 순차적인 접근만으로도 정렬이 가능하기 때문이다.

성능 분석

병합 정렬의 시간 복잡도는 분할 정복 원리에 의해 결정된다.

  • 분할 단계: 리스트를 절반으로 나누는 과정은 이진 트리 구조를 형성하며, 전체 층수는 log2n\log_2 n이 된다.
  • 병합 단계: 각 층에서 모든 원소를 한 번씩 비교하며 병합하므로 각 층당 O(n)O(n)의 시간이 소요된다.
  • 전체 시간 복잡도: 모든 층에서의 작업량을 합산하면 n×log2nn \times \log_2 n이 되어 최종적으로 O(nlogn)O(n \log n)이 된다.

힙 정렬과 비교할 때, 병합 정렬은 추가 메모리를 사용하지만 비교 횟수가 적어 실제 실행 시간에서 더 유리한 경우가 많다.

알고리즘의 변형

  • 자연 병합 정렬(Natural Merge Sort): 입력 데이터에서 이미 정렬된 부분(run)을 찾아 활용함으로써 효율을 높인 변형이다.
  • 제자리 병합 정렬(In-place Merge Sort): 추가 메모리 사용을 줄이기 위해 고안되었으나 구현이 복잡하고 일반적인 병합 정렬보다 속도가 느린 경우가 많다.
  • 외부 정렬(External Sorting): 메모리에 모든 데이터를 올릴 수 없는 대용량 데이터를 정렬할 때, 데이터를 부분적으로 읽어 정렬한 뒤 병합하는 방식으로 사용된다.

장단점

장점

  • 최악의 경우에도 O(nlogn)O(n \log n)의 시간 복잡도를 보장한다.
  • 안정 정렬이므로 데이터의 순서가 중요한 경우에 적합하다.
  • 연결 리스트 정렬 시 효율적이며, 대용량 외부 정렬에 유리하다.

단점

  • 추가적인 임시 배열이 필요하여 메모리 사용량이 크다(O(n)O(n)).
  • 데이터의 크기가 작을 때는 삽입 정렬 등 단순한 알고리즘보다 오버헤드가 클 수 있다.

참고 자료

5
합병 정렬합병 정렬 합병 정렬 또는 병합 정렬(영어: merge sort 머지 소트[*])은 O(n log n)비교 기반정렬 알고리즘이다. 일반적인 방법으로 구현했을 때 이 정렬은안정 정렬에 속하며,분할 정복 알고리즘의 하나이다.존 폰 노이만이 1945년에 개발했다. 상향식 합병 정렬에 대한 자세한 설명과 분석은 1948년 초헤…https://ko.wikipedia.org/wiki/%ED%95%A9%EB%B3%91_%EC%A0%95%EB%A0%ACMerge sortMerge sort In computer science, merge sort (also commonly spelled as mergesort or merge-sort) is an efficient and general purpose comparison-based sorting algorithm. Most implemen…https://en.wikipedia.org/wiki/MergesortMerge sortMerge sort In computer science, merge sort (also commonly spelled as mergesort or merge-sort) is an efficient and general purpose comparison-based sorting algorithm. Most implemen…https://en.wikipedia.org/wiki/Merge_sort병합 정렬 | Delft Stack병합 정렬 | Delft Stack 병합 정렬은 가장 인기 있고 효율적인 정렬 알고리즘 중 하나입니다. 분할 및 정복 알고리즘의 원리를 기반으로합니다. 배열을 개별 요소로 나눌 때까지 반복적으로 배열을 두 개로 나누는 방식으로 작동합니다. 개별 요소는 그 자체로 정렬 된 배열입니다. 병합 정렬은 이러한 작은 정렬 된 배…https://delftstack.com/ko/tutorial/algorithm/merge-sort[알고리즘 > 정렬] 합병정렬과 n log n 이해하기 merge sort n log n | zerozoo-a의 블로그[알고리즘 > 정렬] 합병정렬과 n log n 이해하기 merge sort n log n | zerozoo-a의 블로그 # [알고리즘 > 정렬] 합병정렬과 n log n 이해하기 merge sort n log n - 10 August 2023 각주:[1](배너_이미지_출처) # 합병정렬(merge sort)이란? # 합…https://zerozoo-a.github.io/blog/CS/ALGORITHMS/SEARCH/merge-sort-nlogn/

관련 문서