#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();
}
}
c++模板---堆
最新推荐文章于 2023-09-28 20:10:20 发布