堆类

class Solution 
{
public:
    class Heap
    {
    private:
        int* _Heap=nullptr;
        //int index;
        int maxsize;
    public:
        Heap(){}
        Heap(vector<int>& nums)
        {
          int n=nums.size();
          _Heap= new int[n];
          for(auto t:nums)
            _Heap[t]=nums[t];
          maxsize=n;
        }
        ~Heap(){delete [] _Heap;}
        int MaxDadandSons(int i)
        {
            int j=2*i+1;
            int k=2*i+2;  //右子节点
            if(k>=0 && k<=maxsize-1)
                return (_Heap[j]>=_Heap[k])? ((_Heap[j]>_Heap[i])?j:i):((_Heap[k]>_Heap[i])?k:i);
            else if(j>=0 && j<=maxsize-1)
                return (_Heap[j]>_Heap[i])?j:i;
            else
                return i;
        }
        int delmax()
        {
            int max=_Heap[0];
            _Heap[0]=_Heap[--maxsize];
            adjustdown(0);
            return max;
        }
        bool empty()
        {
            return maxsize<0; 
        }
    protected:
        virtual void adjustup(int )=0;
        void adjustdown(int i)
        {
         int j;
         while(i!=(j=MaxDadandSons(i)))
         {
             swap(_Heap[i],_Heap[j]);
             i=j;
         }
        }
        void heapify()
        {
            for(int i=(maxsize-1)>>1;i>=0;--i)  //由下至上,由后至前的算法
            {
                adjustdown(i);
            }
        }
     
    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值