★부분 리스트의 크기가 1이 될 때까지 계속 분할한다.
1) 정렬되지 않은 데이터
2) 부분 리스트의 길이가 1이 될 때까지 분할
3) 길이가 1인 쪼개진 리스트들은 길이가 1개이므로 정렬이 수행된 것과 같다고 볼 수 있으므로 이들을 병합하여 리스트들을 통합해나가면서 정렬 리스트에 저장
import sys
input = sys.stdin.readline
def MergeSort(lt, rt):
# 왼쪽 포인터가 오른쪽 포인터가 작은 경우
if lt < rt:
# 중간 지점을 구하기
mid = (lt + rt) // 2
# 왼쪽 리스트 병합 정렬
MergeSort(lt, mid)
# 오른쪽 리스트 병합 정렬
MergeSort(mid+1, rt)
p1 = lt
p2 = mid+1
tmp = []
while p1 <= mid and p2 <= rt:
if arr[p1] < arr[p2]:
tmp.append(arr[p1])
p1 += 1
else:
tmp.append(arr[p2])
p2 += 1
# 나머지 들어가지 못한 원소들 마저 추가
if p1 <= mid:
for i in range(p1, mid+1):
tmp.append(arr[i])
if p2 <= rt:
for i in range(p2, rt+1):
tmp.append(arr[i])
# 복사된 배열 tmp를 arr에 넣는다.
for i in range(len(tmp)):
arr[lt+i] = tmp[i]
arr = [23, 11, 45, 36, 15, 67, 33, 21]
print("Before Sort: ", end=" ")
print(arr)
MergeSort(0, len(arr)-1)
print("After Sort: ", end=" ")
print(arr)