Algorithm/APS
[APS] 12. 병합정렬(합병정렬) Merge Sort
개발자 뭄뭄
2022. 10. 3. 20:45
반응형
1. 합병 정렬의 기본적인 idea
list가 주어지면 → 길이가 1일 때까지 나눈다 분할 → 병합 merge !
2. 분할 → python 으로 구현하기
def merge_sort(unordered_list):
if len(unordered_list) <= 1: # list의 길이를 더이상 쪼갤 수 없을 때까지 쪼갠다.
return unordered_list
middle = len(unordered_list) // 2 # 가운데 원소를 중심으로 좌, 우 리스트로 나눈다.
left = unordered_list[:middle]
right = unordered_list[middle:]
left = merge_sort(left) # recursion으로 반복 진행한다.
right = merge_sort(right)
return merge(left, right) # 쪼개고 난 후 병합을 진행한다.
3. 병합 → python 으로 구현하기
def merge(leftlist, rightlist):
i, j = 0, 0 # i는 leftlist의 index, j는 rightlist의 index
sorted_list = [] # 반환할 정렬된 리스트
while i < len(leftlist) or j < len(rightlist):
if i < len(leftlist) and j < len(rightlist):
if leftlist[i] < rightlist[j]:
sorted_list.append(leftlist[i])
i += 1
else:
sorted_list.append(rightlist[j])
j += 1
elif i < len(leftlist):
sorted_list.append(leftlist[i])
i += 1
elif j < len(rightlist):
sorted_list.append(rightlist[j])
j += 1
return sorted_list
a = [ 3, 4, 7, 1, 2, 10, 5, 6, 9 ]
print(merge_sort(a)) # [1, 2, 3, 4, 5, 6, 7, 9, 10]
Uploaded by N2T
반응형