最大堆的ADT实现

这是慕课上堆这一节的输出,为了加深堆的印象

代码


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所以写法比较丑陋

Insert操作

将新元素加到最后一个元素后面以保留完全二叉树的性质然后根据堆的性质进行位置的调整
从最后一个元素出发如果此时不是根节点,且插入元素比父节点大,则将父节点移到当前节点否则退出循环
将插入元素赋给此时的节点

DeleteMax操作

用最后一个元素移到根节点,改变size大小,然后根据堆的性质来换位置,首先找出是否有左右儿子,如果没有那么什么也不做
如果有,那么找出左右儿子中大的那个,如果比记录的最后一个元素大则将该儿子节点上移,然后在该儿子节点的角度按同样的方式去考察
如果比记录最后一个元素小则退出循环.

原文地址:https://www.cnblogs.com/tclan126/p/8798478.html