数据结构:堆的创建

1.首先是完全二叉树(可以使用顺序结构存储)
2.完全二叉树的节点必须满足:
a.如果任意节点都比其孩子节点小,将其称为小堆(小根堆)
b.如果任意节点都比其孩子节点大,将其称为小堆(大根堆)
在这里插入图片描述

堆的特性

1.堆顶元素是集合中最大或最小的元素
2.堆中:任意节点都比其孩子节点大或小
3.从堆顶到任意孩子节点路径中所经的节点是降序或升序。

将完全二叉树转换为堆
在这里插入图片描述

//将完全二叉树转换为堆

void AdjustDown(int array[],int size,int parent)
{
 int child = parent*2+1;//优先让child标记左孩子
 while(child<size)
 {
//需要检测parent是否满足堆的特性
//与其孩子比较,如果不满足则交换:一定要较小的孩子
   if(array[child+1]<array[child])
    child=child+1;
//再检验双亲和较小孩子的关系,不满足则交换
   if(array[child]<array[parent])
  {
  Swap(&array[child],&array[parent]);
  //大的元素往下移动,可能会导致子树不满足堆特性
  parent = child;
  child = parent*2+1;
   }
   else 
     return;  
 }
}

时间复杂度:O(logn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值