最大堆maxheap的一个实现

堆有最大堆,和最小堆。

其中最大堆其实相当于一个优先队列,把队列的优先级存进堆里面,就可以实现优先队列的功能。

//基于数组构建最大堆,该堆是二叉树结构
// Parent(r)=(r-1)/2         r!=0
// Leftchild(r)=2r+1         2r+1<n
// Rightchild(r)=2r+2        2r+2<n
//该堆是一个完全二叉树

#include<iostream>
using namespace std;
template<typename type>
class maxheap
{
private:
    type*Heap;                 //用来存堆地数组
    int size;                  //堆的最大 元素数量
    int n;                     //当前堆地数量
    void swap(type*h,int a,int b)
    {
        type temp=h[a];
        h[a]=h[b];
        h[b]=temp;
    }
public:
    maxheap(type*h,int num,int max)
       {Heap=h;n=num;size=max;}
    int heapsize()const
       {return n;}
    bool isleaf(int pos)const   //是否叶结点
       {return (pos>=n/2)&&(pos<n);}
    int leftchild(int pos)const //当前结点的做孩子结点,实质是数组的下标
       {return 2*pos+1;}
    int rightchild(int pos)const
       {return 2*pos+2;}
    int parent(int pos)const  //pos父结点的位置
       {return (pos-1)/2;}
    void siftdown(int pos)    //将当前结点向下移动
    {
        while(!isleaf(pos))
        {
            int j=leftchild(pos);
            int rc=rightchild(pos);
            if((rc<n)&&(Heap[rc]>Heap[j]))j=rc;
            if(Heap[pos]>=Heap[j])return;
            swap(Heap,pos,j);
            pos=j;
        }
    }
    void siftup(int pos)     //将当前结点向上移动
    {
        if(pos>=n)return;
        int curr=pos;
        while(curr!=0&&Heap[curr]>Heap[parent(curr)]){
                swap(Heap,curr,parent(curr));
                curr=parent(curr);
        }
    }
    bool insert(const type&it) //往数组尾部插入一个结点,然后将该插入的结点,向上移动
    {
        if(n>=size)return false;
        int curr=n;
        n++;
        Heap[curr]=it;
        siftup(curr);
//        while(curr!=0)&&(Heap[curr]>Heap[parent(curr)])
//        {
//            swap(Heap,curr,parent(curr));
//            curr=parent(curr);
//        }
        return true;
    }
    bool removemax(type&it) //删除最大值
    {
        if(0==n)return false;
        n--;
        swap(Heap,0,n);
        if(n!=0)siftdown(0);
        it=Heap[n];
        return true;
    }
    bool remove(int pos,type&it)  //删除位置在pos的结点
    {
        if(pos<0||pos>=n)return false;
        n--;
        swap(Heap,pos,n);
        if(Heap[pos]>Heap[parent(pos)])siftup(pos);
        else siftdown(pos);
        it=Heap[n];
        return true;
    }
    void buildHeap() //将插入的原始数组构造成堆结构
    {
        for(int i=n/2-1;i>=0;i--)siftdown(i);
    }
};
int main()
{
    int a[100]={1,2,0,4,1,6};
    maxheap<int>heap(a,6,100);
    heap.buildHeap();
    int temp;
    heap.removemax(temp);
    cout<<temp<<endl;
    heap.removemax(temp);
    cout<<temp<<endl;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值