힙 자료구조는 완전 이진 트리를 기초로 하는 자료구조이다.
여러 개의 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조이다.
힙은 일종의 반정렬 상태(느슨한 정렬 상태) 를 유지한다. (큰 값이 상위 레벨에 있고 작은 값이 하위 레벨에 있다는 정도를 뜻 함)
간단히 말하면 부모 노드의 키 값이 자식 노드의 키 값보다 항상 크거나 작은 이진 트리를 말한다.
힙 트리에서는 중복 값을 허용한다.
부모노드의 키값과 자식노드의 키값 사이에는 대소관계가 성립한다
1) 최대 힙(Max Heap)
2) 최소 힙(Min Heap)
# Heap의 insert후 재구조화
def up_heapify(index, heap):
child_index = index
while child_index != 0:
parent_index = (child_index-1) // 2
if heap[parent_index] < heap[child_index]:
heap[parent_index], heap[child_index] = heap[child_index], heap[parent_index]
child_index = parent_index
else :
return
# Heap의 delete후 재구조화
def bigger_child(index, heap_size):
parent = index
left_child = (parent * 2) + 1
right_child = (parent * 2) + 2
if left_child < heap_size and heap[parent] < heap[left_child]:
parent = left_child
if right_child < heap_size and heap[parent] < heap[right_child]:
parent = right_child
return parent
def down_heapify(index, heap):
parent_index = index
bigger_child_index = bigger_child(parent_index, len(heap))
while parent_index != bigger_child_index:
heap[parent_index], heap[bigger_child_index] = heap[bigger_child_index], heap[parent_index]
parent_index = bigger_child_index
bigger_child_index = bigger_child_index(parent_index, len(heap))
힙정렬의 시간복잡도는 O(NlogN)으로 빠른 정렬에 속한다. 퀵정렬은 최악의 경우 O(N2)의 성능을 내지만, 힙정렬은 안정적인 성능을 발휘한다. 또한 추가적인 배열을 사용하지 않아 메모리 측면에서도 이점이 있다.
최대 힙 트리나 최소 힙 트리를 구성해 정렬을 할 때 사용한다.