본문 바로가기

카테고리 없음

니트코드 11번 알고리즘: Merge Sort

니트코드 링크: https://neetcode.io/courses/dsa-for-beginners/11

Top Down Merge Sort만 다룬다.

 

Code

# Implementation of MergeSort
def mergeSort(arr, s, e):
    if e - s + 1 <= 1:
        return arr

    # The middle index of the array
    m = (s + e) // 2

    # Sort the left half
    mergeSort(arr, s, m)

    # Sort the right half
    mergeSort(arr, m + 1, e)

    # Merge sorted halfs
    merge(arr, s, m, e)
    
    return arr
# Merge in-place
def merge(arr, s, m, e):
    # Copy the sorted left & right halfs to temp arrays
    L = arr[s: m + 1]
    R = arr[m + 1: e + 1]

    i = 0 # index for L
    j = 0 # index for R
    k = s # index for arr

    # Merge the two sorted halfs into the original array
    while i < len(L) and j < len(R):
        if L[i] <= R[j]:
            arr[k] = L[i]
            i += 1
        else:
            arr[k] = R[j]
            j += 1
        k += 1

    # One of the halfs will have elements remaining
    while i < len(L):
        arr[k] = L[i]
        i += 1
        k += 1
    while j < len(R):
        arr[k] = R[j]
        j += 1
        k += 1​

Complexity

Time Complexity: O(nlogn)

  level 수 : logn

  level 당 opeartion : n 

Memory Complexity: O(n) 

  Merge 할 때 temporary array 두 개 

 

Stability

if leftSubarray[i] <= rightSubarray[j]:
    arr[k] = leftSubarray[i]
    i += 1

left가 작거나 같을 때 left를 넣기 때문에 stabiltiy가 성립한다.