본문 바로가기

Algorithm/C. Sortings & Search

33. Heap Sort

힙(Heap)은 원소를 정해진 규칙에 따라 배치한 완전 이진 트리로, 크게 최소 힙(Min Heap)최대 힙(Max Heap)으로 구분할 수 있다. 최소 힙은 부모 노드의 값이 자식 노드의 값보다 작은 힙을 의미하며, 최대 힙은 그 반대이다. 형제 노드 간에는 대소 관계가 정해지지 않는다.

 

힙에 원소를 삽입하거나 힙에서 원소를 삭제할 경우 먼저 힙의 구조를 맞춘 다음 원소들의 교환을 통해서 대소 관계를 맞게 한다. 힙의 원소의 수가 $n$일 때 삽입/삭제 연산 한 번의 시간복잡도는 $\Theta(\text{lg }n)$이다.

 

이 힙을 이용해서 원소들을 정렬하는 것이 힙 정렬(Heap Sort)이다. 원소를 하나씩 힙에 삽입한 다음 힙의 루트에 있는 값을 빼는 과정을 반복하면 원소를 정렬할 수 있다. 정렬을 한 번 실행할 때 삽입 연산과 삭제 연산을 각각 $n$번 하게 되므로 전체 시간복잡도는 $\Theta(n\text{ lg }n)$이 된다.

 

다음은 힙 정렬을 시뮬레이션한 것이다.

힙 정렬은 최악의 경우에도 시간복잡도가 $\Theta(n\text{ lg }n)$이지만 메모리 접근의 측면에서 힙 정렬이 퀵 정렬보다 열세하고, 힙 정렬은 대체로 포인터를 많이 사용하다 보니 일반적인 경우 퀵 정렬이 힙 정렬보다 빠르게 동작한다.

 

→ solved.ac tag: sorting

'Algorithm > C. Sortings & Search' 카테고리의 다른 글

35. Radix Sort  (0) 2021.03.13
34. Counting Sort  (0) 2021.03.01
32. Quick Sort  (0) 2021.02.28
31. Merge Sort  (0) 2021.02.11
30. Insertion Sort  (0) 2021.02.11