堆
堆的定义
typedef struct HNode *Heap;/*堆的类型定义*/
struct HNode{
ElementType *Data;/*存储元素的数组*/
int Size;/*堆中当前元素个数*/
int Capacity;/*堆的最大容量*/
};
typedef Heap MaxHeap;/*最大堆*/
typedef Heap MinHeap;/*最小堆*/
#define MAXDATA 1000 /*该值应根据具体情况定义为大于堆中所有可能元素的值*/
创建堆
MaxHeap CreateHeap(int MaxSize)
{/*创建容量为MaxSize的空的最大堆*/
MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));
H->Data = (ElementType*)malloc((Maxsize+1)* sizeof(ElementType));
H->Size = 0;
H->Capacity = MaxSize;
H->Data[0] = MAXDATA;/*定义“哨兵”为大于堆中所有可能元素的值*/
return H;
}
插入元素
bool IsFull(MaxHeap H)
{
return(H->Size == H->Capacity);
}
bool Insert(MaxHeap H,ElementType X)
{
int i;
if(IsFull(H)){
printf("最大堆已满");
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;/*将X插入*/
return true;
}
#define ERROR -1 /*错误标识应根据具体情况定义为堆中不可能出现的元素值*/
删除元素
bool IsEmpty(MaxHeap H)
{
return(H->Size == 0);
}
ElementType DeleteMax(MaxHeap H)
{/*从最大堆H中取出键值为最大的元素,并删除一个结点*/
int Parent,Child;
ElementType MaxItem,X;
if(IsEmpty(H))
printf("最大堆已为空");
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;
}
建造最大堆
/*-------建造最大堆-------*/
void PercDown(MaxHeap H,int P)
{/*下滤:将H中以H->Data[p]为根的子堆调整为最大堆*/
int Parent,Child;
ElementType X;
X = H->Data[P];/*取出根结点存放的值*/
for(Parent=p;Parent*2<=H->Size;Parent=Child)
{
Parent = Child;
if((Child!=H->Size)&&(H->Data[Child]<H->Data[Child+1]))
Child++;/*Child指向左右子结点的较大者*/
if(X>=H->Data[Child]) break;/*找到了合适位置*/
else/*下滤*/
H->Data[Parent] = H->Data[Child];
}
H->Data[Parent]=X;
}
void BuildHeap(MaxHeap H)
{/*调整H->Data[]中的元素,使满足最大堆的有序性*/
/*这里假设所有H->Size个元素已经存在H->Data[]中*/
int i;
/*从最后一个结点的父节点开始,到根结点1*/
for(i=H->Size/2;i>0;i--)
PercDown(H,i);
}