简单的数组堆:
小顶堆
#include<iostream>
using namespace std;
template<class T>
class bai_dui{
public:
bai_dui(){sum=0;}
T top(){
return num[1];
}
bool empty(){
if(sum==0) return true;
return false;
}
void push(T x)//插入
{
num[++sum]=x;
int now=sum;
while(now!=1&&num[now]<num[now>>1])
//改为:now!=1&&num[now]>num[now>>1]
{
T temp;
temp=num[now];
num[now]=num[now>>1];
num[now>>1]=temp;
now=now>>1;
}
}
void pop()//删除堆顶
{
num[1]=num[sum--];
int now=1;
while((num[now]>num[now*2]&&now*2<=sum)||(num[now]>num[now*2+1]&&now*2+1<=sum))
/*改为:(num[now]<num[now*2]&&now*2<=sum)||(num[now]<num[now*2+1]&&now*2+1<=sum)*/
{
T temp;
**if(num[now*2+1]>num[now*2])
//改为:num[now*2+1]<num[now*2]**
{
temp=num[now];
num[now]=num[now*2];
num[now*2]=temp;
now=now*2;
}
else {
temp=num[now];
num[now]=num[now*2+1];
num[now*2+1]=temp;
now=now*2+1;
}
}
}
private:
int sum;
T num[10001];
};
//(三处标记部分同时更改,实现大顶堆)
int main()
{
bai_dui<int> h;
int n,m;
cin>>n;
while(n--){
cin>>m;
h.push(m);
}
while(!h.empty()){
cout<<h.top()<<" ";
h.pop();
}
cout<<endl;
return 0;
}
Zu verbessern