最大堆maxheap的一个实现

堆有最大堆,和最小堆。

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

//基于数组构建最大堆,该堆是二叉树结构
// Parent(r)=(r-1)/2         r!=0
// Leftchild(r)=2r+1         2r+1
using namespace std;
template
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)&&(posHeap[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};
    maxheapheap(a,6,100);
    heap.buildHeap();
    int temp;
    heap.removemax(temp);
    cout<


 

你可能感兴趣的:(C++数据学习笔记)