// 最大堆的操作
// 最大堆的创建
typedef struct HeapStruct *MaxHeap;
struct HeapStruct {
ElementType *Elements; // 存储堆元素的数组
int Size; // 堆的当前元素个数
int Capacity; // 堆的最大容量
};
MaxHeap Create(int MaxSize)
{ /* 创建容量为MaxSize的空的最大堆 */
MaxHeap H = malloc(sizeof(struct HeapStruct));
H->Elements = malloc((MaxSize+1) * sizeof(ElementType));
H->Size = 0;
H->Capacity = MaxSize;
H->Elements[0] = MaxData;
/* 定义"哨兵"为大于堆中所有可能元素的值, 便于以后更快的操作 */
return H;
}
// 最大堆的插入
void Insert(MaxHeap H, ElementType item)
{ /* 将元素item插入最大堆H, 其中H->Elements[0]已经定义为哨兵 */
int i;
if(IsFull(H)) {
printf("最大堆已满");
return ;
}
i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */
for( ; H->Elements[i/2] < item; i /= 2)
{
H->Elements[i] = H->Elements[i/2]; // 向下过滤结点
}
H->Elements[i] = item; /* 将item插入 */
}
ElementType DeleteMax(MaxHeap H)
{ /* 从最大堆H中取出键值为最大的元素, 并删除一个结点 */
int Parent, Child;
ElementType MaxItem, temp;
if(IsEmpty(H)) {
printf("最大堆已为空");
return ;
}
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 ++; /* Child指向左右子节点的较大者 */
if(temp >= H->Elements[Child]) break;
else /* 移动temp元素到下一层 */
H->Elements[Parent] = H->Elements[Child];
}
H->Elements[Parent] = temp;
return MaxItem;
}