最大堆的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值