#include <cstdio>
class Heap{
public:
int* array;
int count;
int size;
Heap(int size){
array=new int[size];
this->count=0;
this->size=size;
}
int parent(int i){
if(i<=0||i>=this->count){
return -1;
}
return (i-1)/2;
}
int leftChild(int i){
int left=2*i+1;
if(left>=this->count){
return -1;
}
return left;
}
int rightChild(int i){
int right=2*i+2;
if(right>=this->count){
return -1;
}
return right;
}
int getMax(){
if(count)
return this->array[0];
return -1;
}
void down(int i){//i节点不满足堆性质,向下渗透
int l,r,max,tmp;
l=leftChild(i);
r=rightChild(i);
if(l!=-1&&this->array[l]>array[i]){//大根堆
max=l;
}
else{
max=i;
}
if(r!=-1&&this->array[r]>array[max]){
max=r;
}
if(max!=i){
tmp=array[max];
array[max]=array[i];
array[i]=tmp;
down(max);
}
}
int pop(){
if(this->count==0)return -1;
int data=this->array[0];
this->array[0]=this->array[this->count-1];
count--;
down(0);
return data;
}
int push(int data){
this->count++;
int i=this->count-1;
while(data>this->array[parent(i)]){
this->array[i]=this->array[parent(i)];
i=parent(i);
}
this->array[i]=data;
}
void destroyHeap(){
this->count=0;
// delete [] this->array;
}
void buildHeap(int *a,int n){
for(int i=0;i<n;i++){
this->array[i]=a[i];
}
this->count=n;
for(int i=(n-1)/2;i>=0;i--){
this->down(i);
}
}
};
二叉堆
最新推荐文章于 2024-05-30 09:15:00 发布