합병 정렬은 분할 정복 방법을 사용한다.
합병 정렬을 공부하기 전에, 동적 계획법과 분할 정복에 대해 먼저 알아보겠다.
분할 정복 방법으로 숫자를 정렬하는 알고리즘
데이터를 잘게(길이가 1이 되도록) 쪼개 두개씩 크기를 비교해 정렬하는 알고리즘
1. merge_sort( ) 함수
def merge_sort(list):
if (len(list) <= 1):
return list
mid = len(list) // 2
left_list = list[:mid]
right_list = list[mid:]
left_list = merge_sort(left_list)
right_list = merge_sort(right_list)
return merge(left_list, right_list)
분할과 정복 방법을 사용해 리스트 길이가 1이 될 때까지 나눈다.
2. merge( ) 함수
def merge(left, right):
result = []
while len(left) > 0 or len(right) > 0:
if len(left) > 0 and len(right) >0:
if left[0] <= right[0]:
result.append(left[0])
left = left[1:]
else:
result.append(right[0])
right = right[1:]
# 왼쪽 리스트만 남는 경우
elif len(left) > 0:
result.append(left[0])
left = left[1:]
# 오른쪽 리스트만 남는 경우
elif len(right) > 0:
result.append(right[0])
right = right[1:]
return result
merge_sort()를 이용해 분리한 리스트를 다시 합친다.
① left_list와 right_list의 첫번째 요소를 비교해 작은 값을 결과 리스트(result)에 저장
② result에 저장한 값을 left_list, right_list에서 삭제
③ left_list와 right_list에 남는 요소가 없을 때까지 반복
References
나동빈 알고리즘 강의