C++ 实现堆(heap)

#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;

class minHeap{
   
    private:
        int *heap;       //存储数据和key值的数组,为了简单在这人只存储整数key值
        int capacity;    // 数组的的最大容量
        int size;        // 目前为止数组中有数据的项的数量
        int isLeaf(int pos){
   
            return (pos<size&&pos>=(size/2)-1);
        }
        int left(int pos){
   
            return pos*2+1;
        }
        int right(int pos){
   
            return pos*2+2;
        }
        int parent(int pos){
   
            return (pos-1)/2;
        }
    public:
        //constructor : 通过形参maxSize 用new 给heap指针分配maxSize个内存
        minHeap(int maxSize){
   
            heap=new int[maxSize];
            capacity=maxSize; // 把容量初始化为maxSize
            size=0;   // 刚开始包含数据(key值)为零
        }
        // destructor :   通过delete函数把自己分配的内存先清楚,再交给destructor 处理
        ~minHeap(){
     delete[] heap;} 
        // clear      :  clear的目的是清楚内存中的数据而不是清楚内存,所以我们为了方便先删除内存再进行分配
        void clear(){
   
            delete [] heap; //   先删除内存
            size=0; // 数据数量初始化为零
            heap=new int[capacity];// capacity 是容量不动,并通过他再分配内存
        }

//deleteFirst :  删除heap的第一个(根)元素  并返回其中内容
        int deleteFirst(){
   
            if(size==0)  // 如果heap为空 没有删除的项  退出函数并返回一个乱码(-9999999999)
                return -999999999; 
            if(size==1){
     //如果heap中只有一个元素(项) 那么size变零,退出函数并返回那个项的值
                size--;
                return heap[0];
            }
            int returnElement=heap[0]; //首先把删除项的key值赋给returnElement这个变量
            heap[0]=heap[--size];      //用最后一个元素进行覆盖第一个删除项的元素 并size要减少一个
            int pos=0; // 因为元素之间交换了数据 破坏了minHeap的基本属性,所以下面对minHeap重新整理 pos为除项的下标
            while(!isLeaf( pos)){
     //当回复minHeap过程中,只要pos小标的项变成叶子是退出循环(或者不进入循环)
                int l=left(pos); int r=right(pos); // l 为pos项的左边孩子    r为pos项的右边孩子
                if(l<size&&heap[l]>heap
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值