最大堆的实现及相关操作
#include<iostream>
#include<queue>
using namespace std;
#define MaxData 10000
typedef int ElementType;
typedef struct HeapStruct* MaxHeap;
struct HeapStruct{
ElementType* Elements;
int Size;
int Capacity;
};
MaxHeap Create(int MaxSize);
void Insert(MaxHeap H,ElementType item);
ElementType DeleteMax(MaxHeap H);
bool IsFull(MaxHeap H);
bool IsEmpty(MaxHeap H);
void PercDown(MaxHeap H,int p);
void BuildHeap(MaxHeap H);
void LevelOrderTraversal(MaxHeap H);
int main(){
int N;
scanf("%d",&N);
MaxHeap H=Create(N);
for(int i=1;i<N+1;i++){
scanf("%d",&H->Elements[i]);
H->Size++;
}
BuildHeap(H);
LevelOrderTraversal(H);
return 0;
}
MaxHeap Create(int MaxSize){
MaxHeap H=(MaxHeap)malloc(sizeof(HeapStruct));
H->Elements=(ElementType*)malloc((MaxSize+1)*sizeof(ElementType));
H->Size=0;
H->Capacity=MaxSize;
H->Elements[0]=MaxData;
return H;
}
void Insert(MaxHeap H,ElementType item){
int i;
if(IsFull(H)){
printf("最大堆已满");
return ;
}
i=++H->Size;
for(;H->Elements[i/2]<item;i/=2){
H->Elements[i]=H->Elements[i/2];
}
H->Elements[i]=item;
}
ElementType DeleteMax(MaxHeap H){
int Parent,Child;
ElementType MaxItem,temp;
if(IsEmpty(H)){
printf("最大堆已空");
return NULL;
}
MaxItem=H->Elements[1];
temp=H->Elements[H->Size--];
for(Parent=1;Parent*2<=H->Size;Parent=Child){
Child=Parent*2;
if((Child!=H->Size)&&(H->Elements[Child]<H->Elements[Child+1]))
Child++;
if(temp>=H->Elements[Child])break;
else{
H->Elements[Parent]=H->Elements[Child];
}
}
H->Elements[Parent]=temp;
return MaxItem;
}
bool IsEmpty(MaxHeap H){
return (H->Size==0);
}
bool IsFull(MaxHeap H){
return (H->Size==H->Capacity);
}
void LevelOrderTraversal(MaxHeap H){
queue<int>Q;
if(IsEmpty(H)){
printf("最大堆为空!");
return ;
}
else{
int i=1;
Q.push(i);
while(!Q.empty()){
int x=Q.front();
Q.pop();
printf("%d ",H->Elements[x]);
x*=2;
if(x<=H->Size)Q.push(x);
if(x+1<=H->Size)Q.push(x+1);
}
}
}
void PercDown(MaxHeap H,int p){
int Parent,Child;
ElementType X;
X=H->Elements[p];
for(Parent=p;Parent*2<=H->Size;Parent=Child){
Child=Parent*2;
if((Child!=H->Size)&&(H->Elements[Child]<H->Elements[Child+1]))
Child++;
if(X>=H->Elements[Child])break;
else
H->Elements[Parent]=H->Elements[Child];
}
H->Elements[Parent]=X;
}
void BuildHeap(MaxHeap H){
int i;
for(i=H->Size/2;i>0;i--)
PercDown(H,i);
}