堆的基础知识

基础知识

  • 小根堆(父节点的值大于子节点)
  • 大根堆(相反)
  • 节点在数组中下标为 i 时,左子节点为 2i+1,右子节点为 2i+2

堆的基本操作

这里以大根堆为例

  • 上滤(插入新元素时)
    • 从最后一个节点开始,向上比较,如果父节点小于此节点时,交换位置,直到比较失败,或到达顶端
  • 下滤
    • 从根节点开始,向下比较,其他和上面相反

如何构建堆

  • 自顶向下构建
    • 操作:遍历数组,尾部插入新元素,进行上滤操作
    • 时间复杂度:O(nlogn),每个节点平均为logn/2,共有n个节点
  • 自底向上构建
    1. 先对数组元素进行遍历操作,直接顺序构建堆
    2. 从数 n-1 深度开始,对此深度每个节点进行下滤操作,恢复子节点的堆序性,深度-1,重复此过程
    • 时间复杂度为O(n),共n个节点,每个节点只需要和子节点这一层进行比较

堆的应用

  • 优先队列
    • 弹出最大元素(使用大根堆时,小根堆相反)
      • 步骤:弹出根节点元素,将尾部元素放在根节点,进行下滤操作
      • 由于要重构堆,加上下滤操作后,时间复杂度为 O(logn)
    • 插入新元素
      • 插入后进行上滤操作

堆排序

从小到大排序需要用大根堆,设数组长度为 n,i=n-1

  1. 将根节点与 i 换位置,这样第 i个元素就排好序了
  2. 排除已排好序的元素,对根节点进行下滤
  3. 重复 1,2,直到所有节点排好序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值