Show that the time complexity for the number of assignments of records for the Mergesort algorithm (Algorithms 2.2 and 2.4) is approximated by T (n) = 2n lg n.
- 리스트의 길이가 0 또는 1이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다.
- 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다.
- 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다.
합병정렬 알고리즘은 다음과 같다.
def merge_sort(a):
def sort(unsorted_list):
if len(unsorted_list) <= 1:
return
# 두개의 리스트로 분할. 아래에서 재귀적으로 시행
mid = len(unsorted_list) // 2
left = unsorted_list[:mid]
right = unsorted_list[mid:]
merge_sort(left)
merge_sort(right)
merge(left, right)
def merge(left, right):
i = 0
j = 0
k = 0
while (i < len(left)) and (j < len(right)):
if left[i] < right[j]:
a[k] = left[i]
i += 1
k += 1
else:
a[k] = right[j]
j += 1
k += 1
# 남은 데이터 삽입
while i < len(left):
a[k] = left[i]
i += 1
k += 1
while j < len(right):
a[k] = right[j]
j += 1
k += 1
print(a)
sort(a)
array = [21,10,12,20,25,13,15,22]
merge_sort(array)
합병정렬의 시간복잡도 구하기