(1) 사이즈가 n인 하나의 리스트를 두 개의 균등한 크기의 서브리스트로 분할하고
(2) 각 서브리스트를 재귀적인 방식으로 합병 정렬을 수행하여 정렬한 다음
(3) 두 개의 정렬된 서브리스트를 합하여 전체가 정렬된 리스트가 되게 하는 분할 정복 알고리즘
오른쪽도 같은 방법으로 합병 진행
def merge(lst, temp, low, mid, high):
i = low # i: 왼쪽 트리
j = mid + 1 # j: 오른쪽 트리
for k in range(low, high + 1): # 순회 루프
if i > mid: # i 끝남. 즉, 왼쪽 트리 순회 종료, 오른쪽 트리만 남음.
temp[k] = lst[j]
j += 1
elif j > high: # j 끝남. 즉, 오른쪽 트리 순회 종료, 왼쪽 트리만 남음.
temp[k] = lst[i]
i += 1
elif lst[j] < lst[i]:
temp[k] = lst[j]
j += 1
else:
temp[k] = temp[i]
i += 1
for k in range(low, high+1):
lst[k] = temp[k] # temp에 있는 정렬된 값들을 lst에 넣어주기
def merge_sort(lst, temp, low, high):
if high <= low: # 크기가 1인 리스트
return None
mid = low + (high - low) // 2
merge_sort(lst, temp, low, mid) # 왼쪽 트리
merge_sort(lst, temp, mid + 1, high) # 오른쪽 트리
merge(lst, temp, low, mid, high) # 합치기
lst = [54, 88, 77, 26, 93, 17, 49, 10, 17, 77, 11, 31, 22, 44, 17, 20]
temp = [None] * len(lst)
print('정렬 전: \t', end = '')
print(lst)
merge_sort(lst, temp, 0, len(lst) - 1)
print('정렬 후: \t', end = '')
print(lst)
결과:
정렬 전: [54, 88, 77, 26, 93, 17, 49, 10, 17, 77, 11, 31, 22, 44, 17, 20]
정렬 후: [10, 11, 17, 17, 17, 20, 22, 26, 31, 44, 49, 54, 77, 77, 88, 93]