병합 정렬이란?
재귀 용법을 활용한 정렬 알고리즘으로 배열을 절반으로 잘라나가고 이를 다시 정렬된 배열의 형태로 합병하며 정렬함.
알고리즘 구현
병합 정렬은 배열을 나누는 함수, 나누어진 배열을 하나로 합치는 함수 2가지를 구현해야 함
1. merge 함수
def merge(left, right):
merged = list()
left_index, right_index = 0, 0
while len(left) > left_index and len(right) > right_index:
if left[left_index] > right[right_index]:
merged.append(right[right_index])
right_index += 1
else:
merged.append(left[left_index])
left_index += 1
while len(left) > left_index:
merged.append(left[left_index])
left_index += 1
while len(right) > right_index:
merged.append(right[right_index])
right_index += 1
return merged
2. merge_split 함수(실질적인 병합 정렬 역할의 함수)
def merge_split(data):
if len(data) <= 1:
return data
mid = len(data) // 2
left = merge_split(data[:mid])
right = merge_split(data[mid:])
return merge(left, right)
시간 복잡도
각 단계별로 O(N)으로 실행되고, 그 단계들은 logN개만큼 만들어지므로 O(logN)의 시간 복잡도를 가진다.
결국 이 모든 과정을 통합하면 O(NlogN)이라는 시간 복잡도가 나오게 된다.
'Algorithm > 정렬' 카테고리의 다른 글
퀵 정렬(Quick sort) (0) | 2020.03.23 |
---|---|
삽입정렬(Insertion sort) (0) | 2020.03.23 |