재귀용법을 활용한 병합 정렬 알고리즘
-> 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다
-> 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다.
-> 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다.
def split(list):
if len(list) <= 1:
return list
left_list = split(list[:int(len(list) / 2)])
right_list = split(list[int(len(list) / 2):])
return merge(left_list, right_list)
def merge(left_list, right_list):
arrange_list = []
lp, rp = 0, 0
while (len(left_list) > lp and len(right_list) > rp):
if (left_list[lp] > right_list[rp]):
arrange_list.append(right_list[rp])
rp += 1
else:
arrange_list.append(left_list[lp])
lp += 1
while (len(left_list) > lp):
arrange_list.append(left_list[lp])
lp += 1
while(len(right_list) > rp):
arrange_list.append(right_list[rp])
rp += 1
return arrange_list
이 부분은 2가지의 함수를 사용하였다.
먼저 리스트를 절반으로 나누어 주는데, 계속 절반으로 나눠줘야하기 때문에 리스트를 나누는 부분에 재귀를 적용하였다.
다음은 나누어진 리스트를 작은 순서대로 arrange_list에 넣어준다. 혹시 한쪽 리스트에 있는 값이 다른쪽 리스트에 있는 값 보다 모두 작아서 한쪽 리스트의 값이 하나도 없을 경우도 고려해준다.
그다음 정렬된 리스트를 반환해준다.
강의를 들을수록 초보자도 쉽게 알 수 있게 강의 순서를 고려해주신 것 같다.
설명도 물론 좋다.
'Algorithms > 패캠 알고리즘 강의' 카테고리의 다른 글
이진탐색(1) (0) | 2020.01.26 |
---|---|
병합정렬(2) (0) | 2020.01.26 |
퀵 정렬(1) (0) | 2020.01.24 |
동적 계획법과 분할 정복 (0) | 2020.01.23 |
공간 복잡도 (0) | 2020.01.23 |