[개념]
- 데이터에서 최댓값과 최솟값을 빠르게 찾기 위한 완전 이진 트리(Complete Binary Tree)
- 반정렬 상태(or 느슨한 정렬 상태, 약한 힙) : 부모자식간 우선순위만 고려, 형제간 X
- 힙트리 중복값 허용 : 이진트리 탐색은 중복 허용 X
- 우선순위 큐 : 우선순위 높은 데이터가 먼저 나감
[장점]
- 시간복잡도 감소 : 배열을 쓰는 O(n) 대신 O(logn) 시간 소요됨 (트리의 깊이만큼만 비교)
- 모든 요소를 고려하여 우선순위 정렬X
- 부모노드 우선순위가 항상 자녀노드 우선순위 앞섬
[종류]
- 최소 힙(min heap) / 최대 힙(max heap)

- 최소 힙 : 부모노드 값 ≤ 자식노드 값
- 최대 힙 : 부모노드 값 ≥ 자식노드 값
[동작 과정]
- 인덱스 부여
- 왼쪽 자식노드 인덱스 = 부모 노드 인덱스 x 2 + 1
- 오른쪽 자식노드 인덱스 = 부모 노드 인덱스 x 2 + 2
- 부모노드 인덱스 = (자식 노드 인덱스 - 1) / 2
ex) 1 - (부모)
3 4 - (자식)
- 정렬
- 삽입 : 일단 마지막 노드에 넣고, 부모 노드와 비교하며 힙 재구성
- 삭제 : (최대 힙) 루트 노드 삭제, 빈 자리에 가장 마지막 노드를 가져온 뒤 힙 재구성

[코드]
- heapq 모듈
- heappush(heap, item) : 힙 불변성 유지하며 heap에 item 추가
- heappop(heap) : 힙 불변성 유지하며 heap에서 가장 작은 값 반환 (단, 힙 비어있을 시 에러 발생)
import heapq
heap = []
for i in range(1, 6):
heapq.heappush(heap, i)
for i in range(5):
print(heapq.heappop(heap))
import heapq
heap = []
values = [1, 5, 3, 2, 4]
for value in values:
heapq.heappush(heap, -values)
for i in range(5):
print(-heapq.heappop(heap))