包括最大堆的创建,删除,插入操作:
代码如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef struct HNode* Heap;//堆的类型定义
struct HNode{
int *Data;//存储元素的数组
int Size;//堆中当前的元素数
int Capacity;//堆的最大容量
};
typedef Heap MaxHeap;//最大堆
#define Inf 0x3f3f3f3f
#define ERROR -1
MaxHeap CreatMaxHeap(int MaxSize){//创建容量为MaxSize的最大堆
MaxHeap H=(MaxHeap)malloc(sizeof(struct HNode));
H->Data=(int*)malloc(sizeof(int));
H->Size=0;
H->Capacity=MaxSize;
H->Data[0]=Inf;//定义哨兵为大于堆中的所有元素
return H;
}
bool IsEmpty(MaxHeap H){
return (H->Size==0);
}
bool IsFull(MaxHeap H){
return (H->Size==H->Capacity);
}
void PercDown(MaxHeap H,int p){
//下滤X:将H中以H->Data[p]为根的子堆调整为最大堆
int parent,child;
int X;
X=H->Data[p];//取出根节点存放的值
for(parent=p;parent*2<=H->Size;parent=child){
child=parent*2;
if(child!=H->Size&&(H->Data[child]<H->Data[child+1]))//说明有右孩子
child++;//child指向左右节点较大的一个
if(X>=H->Data[child]) break;//找到了合适位置
else //下滤X
H->Data[parent]=H->Data[child];
}
H->Data[parent]=X;
}
void BuildHeap(MaxHeap H){//建立最大堆
int i;
for(i=H->Size/2;i>=1;i--)
PercDown(H,i);
}
int DeleteHeap(MaxHeap H){//最大堆的删除
int parent,child;
int MaxItem,X;
if(IsEmpty(H)){
printf("最大堆已空\n");
return ERROR;
}
MaxItem=H->Data[1];
X=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++;//child指向左右节点较大的一个
if(X>=H->Data[child]) break;//找到了合适位置
else //下滤X
H->Data[parent]=H->Data[child];
}
H->Data[parent]=X;
return MaxItem;
}
bool Insert(MaxHeap H,int X){//最大堆的插入
int i;
if(IsFull(H)){
printf("最大堆已满\n");
return false;
}
i=++H->Size;//i指向插入后堆的最后一个元素的位置
for(;H->Data[i/2]<X;i/=2)
H->Data[i]=H->Data[i/2];//上滤X
H->Data[i]=X;
return true;
}
int main(){
int maxsize,n;
scanf("%d",&maxsize);
MaxHeap L;
L=CreatMaxHeap(maxsize);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&L->Data[i]);
L->Size=n;
BuildHeap(L);
for(int i=1;i<=n;i++)
printf("%d ",L->Data[i]);
return 0;
}
主函数是我随便测试的,可以根据题目要求不同进行相应的变化。