#include <stdio.h>
#define MaxData 200
typedef struct Heap *MaxHeap;
struct Heap{
int *Elements;//存储堆的数组
int size;//当前元素个数
int capacity;//堆的最大容量
};
MaxHeap create(int Maxsize){
MaxHeap H=new Heap;
H->Elements=new int;
H->size=0;
H->capacity=Maxsize;
H->Elements[0]=MaxData;//定义哨兵,为大于堆中所有可能元素的值
return H;
}
void Insert(MaxHeap H,int item){
int i;
if(H->size==H->capacity){
printf("堆已经满了");
return;
}
i=++H->size;
for(;H->Elements[i/2]<item;i=i/2){
H->Elements[i]=H->Elements[i/2];//让父节点移动下来
}
H->Elements[i]=item;
}
int DeleteMax(MaxHeap H){
int parent,child;
int Maxitem,temp;
if(H->size==0){
printf("栈为空");
return 0;
}
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;
}
void percdown(MaxHeap H,int p){
int parent,child;
int temp=H->Elements[p];
for(parent=p;parent*2<=H->size;parent=child){
child=parent*2;
if((child!=H->size)&&(H->Elements[child+1]>H->Elements[child])){
child++;
}
if(temp>=H->Elements[child]) break;
else{
H->Elements[parent]=H->Elements[child];
}
}
H->Elements[parent]=temp;
}
void BuildHeap(MaxHeap H){
int i;
for(i=H->size/2;i>0;i--){
percdown(H,i);//从最后一个节点的父节点开始
}
}
int main(){
MaxHeap H=create(10);
for(int i=1;i<=10;++i){
scanf("%d",&H->Elements[i]);
H->size++;
}
BuildHeap(H);
for(int i=1;i<=H->size;++i){
printf("%d ",H->Elements[i]);
}
return 0;
}
From 浙大数据结构网课(用于自己复习)
来源:CSDN
作者:絔殇
链接:https://blog.csdn.net/MSmoshang9/article/details/103752070