일반적으로 제가 알고있는 힙의 구조는 우선순위 Queue로 알고 있었습니다.
Heap은 완전 이진트리로 구성되어있고, 다음과 같은 규칙을 따릅니다.
Heap = [0] * 20
Heap_size = 0
def heap_push(num):
global Heap_size
Heap_size += 1
# 우선 가장 마지막 노드에 값을 집어 넣는다.
Heap[Heap_size] = num
# 마지막 자식 노드부터 해당 부모노드와 값을 비교하는데
c_node = Heap_size
p_node = Heap_size//2
# 자식노드가 최상위 노드(1)거나
while c_node != 1:
# 부모노드가 더 클때까지 노드 값을 교환한다.
if Heap[c_node] <= Heap[p_node]:
break
Heap[c_node], Heap[p_node] = Heap[p_node], Heap[c_node]
c_node = p_node
p_node = c_node // 2
def heap_pop():
global Heap_size
tmp = Heap[1]
Heap[1] = Heap[Heap_size]
Heap_size -= 1
p = 1
# 자식노드 두개 중 더 큰 값을 자식 노드 번호로 쓴다.
c = p * 2
while c <= Heap_size:
if c < Heap_size and Heap[c + 1] > Heap[c]:
c += 1
# 자식 노드보다 부모 노드가 크면
if Heap[c] <= Heap[p]:
break
# 자식 노드가 부모노드보다 크면 교환
Heap[p], Heap[c] = Heap[c], Heap[p]
p = c
c = p * 2
return tmp
arr = [4, 3, 5, 2, 6, 1, 8, 7, 9]
for num in arr:
heap_push(num)
print(Heap)
while Heap_size:
print(heap_pop())