标签:记录 印象 break 插入 代码 大小 sem 方式 maxsize
这是慕课上堆这一节的输出,为了加深堆的印象
struct MaxHeap{
vector<ElementType> Elements;
int size;
int cap;
MaxHeap(int MaxSize):size(0),cap(MaxSize){
Elements.resize(MaxSize);
}
bool IsFull() {return size == Elements.size();}
bool IsEmpty() {return size == 0;}
void Insert(ElementType item) {
int i = ++size;
for(;i/2 > 0 && Elements[i/2] < item;i/=2) {
Elements[i] = Elements[i/2];
}
Elements[i] = item;
}
ElementType DeleteMax() {
ElementType temp,MaxItem = Elements[1];
int parent,child;
temp = Elements[size--];
for(parent = 1; parent*2 <= size;parent = child) {
child = parent*2;
if(child+1 <= size && Elements[child+1] > Elements[child]) child++;
if(Elements[child] < temp) break;
else Elements[parent] = Elements[child];
}
Elements[parent] = temp;
return MaxItem;
}
};
不太熟悉c++的idiom所以写法比较丑陋
将新元素加到最后一个元素后面以保留完全二叉树的性质然后根据堆的性质进行位置的调整
从最后一个元素出发如果此时不是根节点,且插入元素比父节点大,则将父节点移到当前节点否则退出循环
将插入元素赋给此时的节点
用最后一个元素移到根节点,改变size大小,然后根据堆的性质来换位置,首先找出是否有左右儿子,如果没有那么什么也不做
如果有,那么找出左右儿子中大的那个,如果比记录的最后一个元素大则将该儿子节点上移,然后在该儿子节点的角度按同样的方式去考察
如果比记录最后一个元素小则退出循环.
标签:记录 印象 break 插入 代码 大小 sem 方式 maxsize
原文地址:https://www.cnblogs.com/tclan126/p/8798478.html