
int PQdel(){
int j, min =0;
for(j=1; j<N; j++){
if(less(pq[min], pq[j]))
min = j;
swap(pq[min], pq[N-1]);
return pq[--N];
}// make max heap
for(i = n/2 ; i > 0 ; i--) // 자식노드가 있는 최대 인덱스 노드는 n/2임.
adjust (list, i, n);
// extract items one by one
for(i = n-1; i>0 ; i--){ // 힙에서 최댓값을 하나씩 꺼내서 맨 뒤에 저장
swap(list[1], list[i+1]);
adjust(list, 1, i);
}ADJUST(A, i, n):
1 L ← left(i); R ← right(i) // i의 두 자식 인덱스
2 largest ← i // 일단 i가 가장 큰 것으로 가정
3 if L ≤ n and A[L] > A[largest]: // 왼쪽 자식이 존재하고 더 크면
4 largest ← L
5 if R ≤ n and A[R] > A[largest]: // 오른쪽 자식도 검사
6 largest ← R
7 if largest ≠ i: // 자식 중 하나가 더 크다 → 힙 위반
8 swap A[i], A[largest] // 부모/자식 교환
9 ADJUST(A, largest, n) // 깨졌을 수 있는 아래쪽 서브트리로 재귀
10 // else: 자식보다 부모가 크거나 같음 → 이미 힙 만족, 종료for(i = n/2 ; i > 0 ; i--) // 자식노드가 있는 최대 인덱스 노드는 n/2임.
adjust (list, i, n); // 시간복잡도 최악은 O(log n)
높이 h (루트에서 거리) | 그런 노드 수 | 한 노드당 비용 (≈ O(h)) | 총비용 |
log n (루트) | 1 | O(log n) | O(log n) |
log n − 1 | 2 | O(log n − 1) | O(2 log n) |
log n − 2 | 4 | O(log n − 2) | O(4 (log n − 2)) |
… | … | … | … |
1 | n/2 | O(1) | O(n/2) |
for(i = n/2 ; i > 0 ; i--) // 자식노드가 있는 최대 인덱스 노드는 n/2임.
adjust (list, i, n); // 시간복잡도 최악은 O(log n)
for (i = 0; i < n; i++)
pq_insert(q, s[i]); // 각 insert는 bubble_upfor (i = q->n / 2; i >= 1; i--)
adjust(q, i, q->n); // bubble_down