재귀용법을 활용한 정렬 알고리즘
직접 눈으로 보면 더 이해가 쉽다: https://visualgo.net/en/sorting
mergesplit 함수 만들기
if left[left_index] < right[right_index]:
sorted.append(left[left_index]
left_index += 1
else:
sorted.append(right[right_index])
right_index += 1
프로그래밍 연습
어떤 데이터리스트가 있을 때 리스트를 앞뒤로 짜르는 코드 작성해보기 (일반화)
def split_func(data):
medium = int(len(data) / 2)
print (medium)
left = data[:medium]
right = data[medium:]
print (left, right)
split_func([1, 5, 3, 2, 4])
2
[1, 5] [3, 2, 4]
재귀용법 활용하기
프로그래밍 연습
다음 문장을 코드로 작성해보기 (merge함수는 아직은 없는 상태, 있다고만 가정)
* mergesplit 함수 만들기
- 만약 리스트 갯수가 한개이면 해당 값 리턴
- 그렇지 않으면, 리스트를 앞뒤, 두 개로 나누기
- left = mergesplit(앞)
- right = mergesplit(뒤)
- merge(left, right)
def mergesplit(data):
if len(data) <= 1:
return data
medium = int(len(data) / 2)
left = mergesplit(data[:medium])
right = mergesplit(data[medium:])
return merge(left, right)
최종 코드
def merge(left, right):
merged = list()
left_point, right_point = 0, 0
# case1 - left/right 둘다 있을때
while len(left) > left_point and len(right) > right_point:
if left[left_point] > right[right_point]:
merged.append(right[right_point])
right_point += 1
else:
merged.append(left[left_point])
left_point += 1
# case2 - left 데이터가 없을 때
while len(left) > left_point:
merged.append(left[left_point])
left_point += 1
# case3 - right 데이터가 없을 때
while len(right) > right_point:
merged.append(right[right_point])
right_point += 1
return merged
def mergesplit(data):
if len(data) <= 1:
return data
medium = int(len(data) / 2)
left = mergesplit(data[:medium])
right = mergesplit(data[medium:])
return merge(left, right)
import random
data_list = random.sample(range(100), 10)
mergesplit(data_list)
[8, 12, 24, 40, 47, 70, 81, 87, 92, 96]