算法导论 第六章优先队列总结
HEAP-EXTRACT-MAX(A)
1 if heap-size[A] < 1
2 then error "heap underflow"
3 max ← A[1]
4 A[1] ← A[heap-size[A]]
5 heap-size[A] ← heap-size[A] - 1
6 MAX-HEAPIFY(A, 1)
7 return max
这个算法就是把堆顶元素返回,再返回之前将其另存,再将其复制为数组中最后的一个元素,再重新建立最大堆。
HEAP-INCREASE-KEY(A, i, key)
1 if key < A[i]
2 then error "new key is smaller than current key"
3 A[i] ← key
4 while i > 1 and A[PARENT(i)] < A[i]
5 do exchange A[i] ↔ A[PARENT(i)]
6 i ← PARENT(i)
首先检查,因为是增加,所以要检查是否给出的key大于原有的key。先使堆大小+1,再将新的节点放在堆的左后一个位置上,并进行 与父节点的比较 ,直到堆顶为止。
MAX-HEAP-INSERT(A, key)
1 heap-size[A] ← heap-size[A] + 1
2 A[heap-size[A]] ← -∞
3 HEAP-INCREASE-KEY(A, heap-size[A], key)
仍然是先把堆大小+1,在把堆中最后一个元素赋值为负无穷,通过HEAP-INCREASE-KEY函数实现重建堆。
6.5-7提到了HEAP-DELETE算法,算法思想是:
将要删除节点元素数值赋值为堆中最后一个元素数值,再重建堆。这里要注意的是,重建堆时不见要像HEAP-INCREASE-KEY算法一样与父节点比较,还可能与子节点比较。如果比父节点大,则与父节点交换数值,并继续向上比较;如果比父节点小,则要与其子节点比较。若是小于,则与之小环数值,若不小于,则当前堆已经是最大堆或最小堆,这时算法即可结束。
Heap-Delete(A; i)
1 if i > heap-size[A]
2 then error “heap underflow”
3 A[i] Ã A[heap-size[A]]
4 heap-size à heap-size-1
5 if A[i] > A[Parent(i)]
6 then Heap-Increase-Key(A; i;A[i])
7 else Max-Heapify(A; i)