본문 바로가기

CS/알고리즘

[알고리즘] Merge Sort

반응형

Merge Sort

Divide and Conquer(분할정복) 방법을 통해 구현

Pivot 없이 정확히 반씩 나누어 나중에 정렬하는 알고리즘


Process

1. 리스트 길이가 2 이상일 때 절반으로 분할한다 (divide)

2. 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다 (conquer)

3. 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병하며, 정렬 결과를 임시배열에 저장한다 (combine)

4. 임시 배열에 저장된 결과를 원래 배열에 복사한다 (copy)


Code

numbers = []
length = 100


for i in range(length, 0, -1):
    numbers.append(i)


def merge(start, middle, end):
    temp = []

    i, j = start, middle + 1

    while i <= middle and j <= end:
        if numbers[i] < numbers[j]:
            temp.append(numbers[i])
            i += 1
        else:
            temp.append(numbers[j])
            j += 1

    while i <= middle:
        temp.append(numbers[i])
        i += 1

    while j <= end:
        temp.append(numbers[j])
        j += 1

    for idx in range(end - start + 1):
        numbers[start + idx] = temp[idx]


def mergeSort(start, end):
    if start >= end:
        return

    mid = (start + end) // 2

    mergeSort(start, mid)
    mergeSort(mid + 1, end)
    merge(start, mid, end)


mergeSort(0, length - 1)
print(numbers)

Time Complexity

최선/최악 모두 분할이 절반씩 일어나기때문에

비교 시간복잡도는 O(logN), 각 순환 호출 단계의 비교 연산은 O(N)으로 O(Nlog₂N) 이다


Space Complexity

정렬 시 별도 메모리 공간이 필요하다 O(N) 


C, JAVA, PYTHON 의 표준 정렬 라이브러리는 Quick Sort, Merge Sort 의 아이디어를 채택한 하이브리드 방식의 정렬 알고리즘을 사용한다

divide and conquer 과정에서 같은 값을 가지는 데이터의 인덱스가 변경되지 않으므로 stable sorting 이다

반응형

'CS > 알고리즘' 카테고리의 다른 글

[알고리즘] Heap Sort  (0) 2021.09.30
[알고리즘] Counting Sort  (0) 2021.09.25
[알고리즘] Quick Sort  (0) 2021.09.25
[알고리즘] Insertion Sort  (0) 2021.09.25
[알고리즘] Selection Sort  (0) 2021.09.25