본문 바로가기

CS/알고리즘

[알고리즘] Heap Sort

반응형

Heap Sort

최대 힙, 최소 힙 구조를 통해 정렬하는 알고리즘


Heap 이란?

최솟값이나 최댓값을 빠르게 찾아내기 위해 사용되는 구조로
완전 이진 트리를 기반으로 하는 트리이다

각 노드의 값이 자신의 자식노드가 가진 값보다 크거나 같다면 최대 힙 (Max Heap)
각 노드의 값이 자신의 자식노드가 가진 값보다 작거나 같다면 최소 힙 (Min Heap)


Process

1. 완전 이진트리 형태의 최대 힙을 만든다

2. 힙에서 하나씩 데이터를 꺼내어 배열의 맨 뒤에 저장한다

    이 때 최댓값부터 꺼내지므로 내림차순으로 정렬된다

3. 남겨진 데이터는 최대 힙을 유지한다


heapify

힙 성질을 만족하도록 하는 연산을 heapify 라고 한다

 

예를 들어 최대 힙의 경우

루트 노드부터 리프 노드까지 부모 노드가 자식 노드보다 값이 크다는 최대 힙의 성질을 만족하도록 하는 연산이다


Code

array = [2, 3, 4, 10, 8, 1, 6, 9, 5]
n = len(array)

def heapify(idx, n):
    parent = idx
    left = 2 * idx + 1
    right = 2 * idx + 2

    if left < n and array[left] > array[parent]:
        parent = left

    if right < n and array[right] > array[parent]:
        parent = right

    if parent != idx:
        array[parent], array[idx] = array[idx], array[parent]
        heapify(parent, n)


def heapSort():
    # 최대 힙 구성
    for i in range(n//2, -1, -1):
        heapify(i, n)

    # 최대 값을 배열뒤로 보내 정렬
    for i in range(n-1, 0, -1):
        array[0], array[i] = array[i], array[0]
        heapify(0, i)


heapSort()
print(array)

Time Complexity

힙 트리는 완전 이진 트리이므로 전체 높이가 log₂N 이다

따라서 데이터 하나를 삽입하거나 삭제 할 때의 재정비 시간이 log₂N 만큼 소요된다

데이터 개수가 n개 이므로 O(Nlog₂N) 의 시간이 걸린다

 

Quick, Merge Sort와 평균 시간복잡도는 동일하지만 실제로 둘이 Heap Sort 보다 더 빠르다고 한다


Space Complexity

정렬하고자하는 배열안에서 교환하는 방식으로 다른 메모리 공간을 필요로 하지 않는다 (in-place sorting)

따라서 O(N) 이다


Heap 자료구조는 삭제 시 말단 노드가 루트자리로 swap 되며 같은 값을 가진 데이터의 위치가 변경될 수 있어 unstable sorting 이다

반응형

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

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