병합 정렬 Merge Sort
Merge Sort
시간복잡도는 Worst - O(NlogN), Average - O(NlogN), Best - O(NlogN)
Merge Sort의 경우 원래 리스트의 크기만큼의 추가공간이 필요하다.
입력 Data의 크기가 클 경우 Overhead가 증가할 수 있다.
Divide & Conquer 단계를 수행하므로 시간 복잡도는 LogN이다.
Merge Sort는 3단계로 구성된다.
- 각 리스트를 절반으로 나누는 Divide 단계
- 나눠진 리스트를 정렬하는 Conquer 단계
- 정렬된 리스트를 하나로 합치는 Combine 단계
def merge_sort(data):
result = []
# 중간 index 구하기
mid = (len(data))//2
# 재귀 종료 조건
if len(data) < 2 :
return data
# 재귀 호출로 분할 : Divide
left = merge_sort(data[:mid])
right = merge_sort(data[mid:])
# 나눠진 두 배열을 정렬 : Conquer
i = j = 0
while i<len(left) and j<len(right):
if left[i] < right[j]:
result.append(left[i])
i = i+1
else:
result.append(right[j])
j = j+1
# 비교 후 남아 있는 값 병합 : Merge
result += left[i:]
result += right[j:]
return result
data = [7,5,3,1,4,2,6,8]
merge_sort(data)
* Merge sort를 더 효율적으로 구현하기 위해서는 배열을 생성하는 과정 대신, 정렬시마다 기존 배열에 반영해 주어야 한다
'알고리즘' 카테고리의 다른 글
[이진탐색] Binary Search - Python (2) | 2020.12.25 |
---|---|
[버블 정렬] Bubble Sort - Python (0) | 2020.12.25 |
[프로그래머스] 정렬 - K번째 수 (0) | 2020.12.24 |
[퀵 정렬] Quick Sort - Python (0) | 2020.12.24 |
[선택정렬, 삽입정렬] - Selection Sort, Insertion Sort (Python) (0) | 2020.12.23 |