c++模板---堆

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
template<typename T>
class priority
{
    T * e;
    int sz;
public:
    priority(int n=1005);
    priority(T * a,int n);
    T top();
    void pop();
    void push(T x);
    bool isempty();
    void makeheap(T *a,int n);
    void down(int n);
};
template<typename T>
priority<T>::priority(T * a,int n)
{
    e=new T[1005];
    memcpy(e+1,a,n*sizeof(T));
    /*
    for(int i=1;i<=n;i++)
    {
        cout<<e[i]<<" ";
    }
    cout<<endl;
    */
    sz=n;
    int i=sz/2;
    while(i>=1){
        down(i);
        i--;
    }
}
template<typename T>
bool priority<T>::isempty()
{
    return sz==0?true:false;
}
template<typename T>
priority<T>::priority(int n)
{
    e=new T[n];
    sz=0;
}
template<typename T>
T priority<T>::top()
{
    return e[1];
}
template<typename T>
void priority<T>::down(int n)
{
    int i=n;
    while(i*2+1<=sz)
    {
        int a=2*i;
        int b=2*i+1;
        if(e[a]<e[b])a=b;
        if(e[i]<e[a])swap(e[i],e[a]);
        else break;
        i=a;
    }
}
template<typename T>
void priority<T>::push(T x)
{
    e[++sz]=x;
    int i=sz;
    while(i>1)
    {
        int p=i/2;
        if(e[i]>e[p])swap(e[i],e[p]);
        else break;
        i=p;
    }
}
template<typename T>
void priority<T>::pop()
{
    e[1]=e[sz--];
    int i=1;
    while(2*i+1<=sz)
    {
        int a=2*i;
        int b=2*i+1;
        if(e[a]<e[b])a=b;
        if(e[i]<e[a])swap(e[i],e[a]);
        else break;
        i=a;
    }
}
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9};
    priority<int>q(a,(int)sizeof(a)/4);
    while(!q.isempty())
    {
        cout<<q.top()<<endl;
        q.pop();
    }
    for(int i=1;i<=7;i++)
    {
        q.push(i);
    }

    while(!q.isempty())
    {
        cout<<q.top()<<endl;
        q.pop();
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章