#include "stdio.h"
#include "stdlib.h"
typedef struct Heap { //定义堆结构
int *data;
int Size;
int Capacity;
}MaxHeapNode,*MaxHeap;
MaxHeap CreatHeap(int Maxsize) { //堆初始化
MaxHeap H = (MaxHeap)malloc(sizeof(MaxHeapNode));
H -> data = (int *)malloc((Maxsize + 1)*sizeof(int));
H -> Size = 0;
H -> Capacity = Maxsize;
H -> data[0] = 1000;
return H;
}
void InsertHeap(MaxHeap H,int temp) { //插入数据
int i;
if(H->Size == H->Capacity) {
printf("最大堆已满");
return;
}
for(i = ++H -> Size; i > 1 && (H -> data[i/2] < temp); i /= 2) //不需要设置H -> data[0]哨兵值
//for(; H -> data[i/2] < temp; i /= 2) //需要设置H -> data[0]哨兵值
H -> data[i] = H -> data[i/2];
H -> data[i] = temp;
}
int DeleteMax(MaxHeap H) { //弹出最大值,并调整剩余部分形成最大堆
int Parent,Child;
int Maxitem,temp;
if(H->Size == H->Capacity) {
printf("最大堆已满");
return -1;
}
Maxitem = H -> data[1];
temp = H -> data [H -> Size--];
for(Parent = 1; Parent * 2 <= H -> Size; Parent = Child) {
Child = Parent * 2;
if((Child != H -> Size) && (H -> data[Child] < H -> data[Child + 1]))
Child++;
if(temp >= H -> data[Child]) break;
else H -> data[Parent] = H -> data[Child];
}
H -> data[Parent] = temp;
return Maxitem;
}
int main() {
MaxHeap H = NULL;
int Maxsize = 50;
int temp[20] = {17,3,8,10,15,21,12,7,13,4,9,16,11,5,6,1,2,14,19,18};
int i = 0;
H = CreatHeap(Maxsize);
for(i=0;i<20;i++) {
InsertHeap(H,temp[i]);
}
for(i=0;i<20;i++) {
printf("%d ",DeleteMax(H));
}
return 0;
}