zoukankan      html  css  js  c++  java
  • 最大堆的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大小,然后根据堆的性质来换位置,首先找出是否有左右儿子,如果没有那么什么也不做
    如果有,那么找出左右儿子中大的那个,如果比记录的最后一个元素大则将该儿子节点上移,然后在该儿子节点的角度按同样的方式去考察
    如果比记录最后一个元素小则退出循环.

  • 相关阅读:
    tmux 的基本使用
    ffmpeg(1) 基础框架
    VUE页面跳转方式
    nextcloud 中文乱码解决方案
    mysql8 navicat远程链接失败
    prometheus+grafana实现服务监控
    sqlalchemy ————关联表
    Python flask自定义异常信息,返回json格式的异常
    sqlalchemy 查询结果转json个人解决方案
    Linux添加字体
  • 原文地址:https://www.cnblogs.com/tclan126/p/8798478.html
Copyright © 2011-2022 走看看