Merge sort
merge sort (병합 정렬)
오늘은 merge sort 시간복잡도 및 구현에 대해 포스팅해 보겠습니다.
merge sort 란?
- merge sort 란?
- 비교 기반 알고리즘으로 최선 & 최악 시간복잡도가
n log n
의 안정적인 퍼포먼스를 보여주는 정렬입니다. - 분할 정복 방법을 통해 구현됩니다. 주어진 리스트를 잘게 쪼겐 후 합병하는 방식으로 진행됩니다.
- 비교 기반 알고리즘으로 최선 & 최악 시간복잡도가
- 샘플 코드
def mergeSort(myList):
if len(myList) > 1:
mid = len(myList) // 2
left, right = myList[:mid], myList[mid:]
mergeSort(left)
mergeSort(right)
i,j = 0, 0
k = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
myList[k] = left[i]
i += 1
else:
myList[k] = right[j]
j += 1
k += 1
while i < len(left):
myList[k] = left[i]
i += 1
k += 1
while j < len(right):
myList[k]=right[j]
j += 1
k += 1
2 함수로 분할한 예제
def mergeSort(myList):
if not myList:
return None
if len(myList) == 1:
return myList
mid = len(myList)//2
left, right = mergeSort(myList[:mid]), mergeSort(myList[mid:])
return merge(myList, left, right)
def merge(myList, left, right):
i,j = 0,0
k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
myList[k] = left[i]
i += 1
else:
myList[k] = right[j]
j += 1
k += 1
while i < len(left):
myList[k] = left[i]
i += 1
k += 1
while j < len(right):
myList[k] = right[j]
j += 1
k += 1
return myList
linked list 가 포함된 list의 merge sort
def mergeKLists(lists: List[Optional[ListNode]]) -> Optional[ListNode]:
if not lists:
return None
if len(lists) == 1:
return lists[0]
mid = len(lists)//2
l,r = mergeKLists(lists[mid:]), mergeKLists(lists[:mid])
return merge(l,r)
def merge(l, r):
dummy = p = ListNode()
while l and r:
if l.val < r.val:
p.next = l
l = l.next
else:
p.next = r
r = r.next
p = p.next
if l:
p.next = l
if r:
p.next = r
return dummy.next