IT이야기
병합 정렬(Merge Sort): 안정적인 분할 정복 기반 정렬 알고리즘
Chiba-in
2025. 3. 2. 06:15
🔹 병합 정렬이란?
1. 병합 정렬(Merge Sort)의 정의
병합 정렬(Merge Sort)은 분할 정복(Divide & Conquer) 방식을 사용하여 배열을 분할하고, 정렬된 하위 배열을 병합하여 정렬하는 효율적인 알고리즘입니다.
✅ 병합 정렬의 주요 특징:
- 배열을 반으로 나눈 후 재귀적으로 정렬
- 최악의 경우에도 O(n log n)의 시간 복잡도를 보장
- 안정 정렬(Stable Sort), 즉 동일한 값의 상대적인 순서를 유지
- 추가적인 메모리 공간(O(n))이 필요
📌 병합 정렬은 안정적인 성능을 보장하며, 대규모 데이터 정렬에 적합합니다.
🔹 병합 정렬의 동작 과정
- 배열을 절반으로 나눔 (Divide)
- 각 부분 배열을 재귀적으로 정렬
- 정렬된 하위 배열을 병합 (Merge)
✔️ 병합 정렬 예제 (Python):
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
arr = [64, 34, 25, 12, 22, 11, 90]
print(merge_sort(arr))
📌 병합 정렬은 재귀를 이용해 구현할 수 있으며, 정렬된 하위 배열을 효율적으로 병합합니다.
🔹 병합 정렬의 시간 복잡도 분석
케이스 | 시간 복잡도 |
---|---|
최악의 경우 (O(n log n)) | 모든 경우에서 일정한 성능 보장 |
평균적인 경우 (O(n log n)) | 일반적인 무작위 데이터 정렬 |
최선의 경우 (O(n log n)) | 이미 정렬된 경우에도 O(n log n) |
📌 퀵 정렬과 달리 최악의 경우에도 O(n log n)을 유지하므로 안정적인 성능을 보장합니다.
🔹 병합 정렬의 시각적 표현
✔️ 입력 배열: [5, 3, 8, 4, 2]
- 배열 분할:
[5, 3, 8]
|[4, 2]
- 추가 분할:
[5] [3, 8]
|[4] [2]
- 정렬 및 병합:
[3, 5, 8]
|[2, 4]
- 최종 병합:
[2, 3, 4, 5, 8]
📌 병합 정렬은 정렬된 작은 리스트를 병합하여 전체 정렬을 완성합니다.
🔹 병합 정렬의 장점과 단점
✅ 장점:
- O(n log n)의 일정한 시간 복잡도를 유지
- 안정 정렬(Stable Sort)로 동일한 값의 순서가 유지됨
- 연속된 메모리 할당이 필요하지 않아 외부 정렬(External Sorting)에 유리
❌ 단점:
- 추가적인 메모리(O(n))가 필요하여 공간 효율성이 낮음
- 짧은 리스트에서는 퀵 정렬보다 성능이 떨어질 수 있음
- 연결 리스트에서는 효과적이지만, 배열에서는 메모리 비용이 높음
📌 메모리 사용량이 많지만, 일관된 성능을 보장하는 것이 강점입니다.
🔹 병합 정렬 vs 다른 정렬 알고리즘 비교
정렬 알고리즘 | 최악 시간 복잡도 | 평균 시간 복잡도 | 공간 복잡도 | 안정 정렬 |
---|---|---|---|---|
버블 정렬 | O(n²) | O(n²) | O(1) | O |
선택 정렬 | O(n²) | O(n²) | O(1) | X |
삽입 정렬 | O(n²) | O(n²) | O(1) | O |
병합 정렬 | O(n log n) | O(n log n) | O(n) | O |
퀵 정렬 | O(n²) | O(n log n) | O(log n) | X |
📌 병합 정렬은 안정적인 O(n log n) 성능을 보장하지만, 추가 메모리 사용이 필요합니다.
📌 결론
✅ 병합 정렬(Merge Sort)은 분할 정복 방식을 사용하여 데이터를 안정적으로 정렬하는 알고리즘입니다.
✅ O(n log n)의 일정한 성능을 보장하며, 대량의 데이터에서도 효율적입니다.
✅ 추가적인 메모리를 사용해야 하지만, 안정 정렬이 필요한 경우 적합합니다.
✅ 퀵 정렬과 비교했을 때 최악의 경우에도 안정적인 성능을 유지하는 장점이 있습니다.