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

  • 相关阅读:
    Git 分支管理
    Kubernetes 中文文档
    Docker 命令大全
    Redis 常用命令 大全
    Docker 资源汇总
    Docker 安装 Redis
    JavaScript闭包
    CSS选择器
    JavaScript类型转换
    javascript字符串处理方法
  • 原文地址:https://www.cnblogs.com/tclan126/p/8798478.html
Copyright © 2020-2023  润新知