最大堆的插入和删除

//********************************************************************最大堆的插入
int IsFull(MaxHeap H)
{
return H->Capacity == H->Size;
}
int Insert(MaxHeap H, int X)
{
//将元素X插入最大堆H,其中H->Data[0]已经定义为哨兵
int i;


if (IsFull(H)) {
printf("最大堆已满\n");
return 0;
}
i = ++H->Size;//i指向插入后堆中的最后一个元素的位置
for (; H->Data[i / 2] < X; i /= 2) {
H->Data[i] = H->Data[i / 2];//上滤//哨兵的作用
}
H->Data[i] = X;//将X插入
return 1;
}
//*******************************************最大堆的删除
#define ERROR -1//错误标识应该视具体情况定义为堆中不可能出现的元素值
int IsEmpty(MaxHeap H)
{
return H->Size == 0;
}
int DeleteMax(MaxHeap H)
{
//从最大堆H中取出键值为最大的元素,并删除一个节点
int Parent, Child;
int MaxItem, X;
if (IsEmpty(H)) {
printf("堆已空\n");
return 0;
}
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++;//指向左右节点的较大者
}
if (X > H->Data[Child])break;//找到了合适的位置
else //下滤
H->Data[Parent] = H->Data[Child];
}
H->Data[Parent] = X;
return MaxItem;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值