文章目录
1.二叉堆的定义(最大堆:任何一棵子树的最大值在子树的头部)
2.二叉堆的存储
3.操作
3.1 插入元素(shift up)
插入前:
插入后:
3.2 取出元素(shift down)
取出前:
调整后:
4.堆的实现
template<typename Item>
class MaxHeap{
private:
Item *data;
int count;
int capacity;
void shiftUp(int k){
while( k > 1 && data[k/2] < data[k] ){
swap( data[k/2], data[k] );
k /= 2;
}
}
void shiftDown(int k){
while( 2*k <= count ){
int j = 2*k; // 在此轮循环中,data[k]和data[j]交换位置
if( j+1 <= count && data[j+1] > data[j] )
j ++;
// data[j] 是 data[2*k]和data[2*k+1]中的最大值
if( data[k] >= data[j] ) break;
swap( data[k] , data[j] );
k = j