数据结构:堆Heap的理解

本文详细介绍了堆数据结构的物理与逻辑结构,大根堆和小根堆特性,以及基本操作如下滤、上滤和建堆。重点讲解了堆排序算法、优先队列的使用,包括插入与弹出操作。通过实例演示了堆序性维护和堆的构造方法。

数据结构:堆Heap的理解

堆排序 参考帖子

堆的结构:

  1. 物理结构:一维数组,

  2. 逻辑结构:一颗完全二叉树,

    • 只允许最后一行不为满;且最后一行必须从左往右排序;最后一行元素之间不可以有间隔

堆的特性:

  1. 堆序性:分小根堆和大根堆
    • 大根堆中:每个父节点元素都要大于它的子节点元素
    • 小根堆中:每个父节点元素都要小于它的子节点元素

堆的储存:

一个大根堆就可以用一个一维数组来描述

规律:节点下标为i

​ 左子节点下标为 2i+1

​ 右子节点下标为 2i+2

image-20220817193227543

堆的基本操作:

  1. 下滤

来看一个案例:

image-20220817193956384

image-20220817194558458

以这个大根堆为例,根节点不符合堆序行,那么我们就会将这个根节点与它的子节点进行比较,如果小于它的子节点则与之交换,直至满足堆序性,这种将根节点向下替换的操作我们称为下滤操作

复杂度:O(logN)

  1. 上滤

上滤其实就是下滤相反,子节点有不符合堆序性的节点,则将该节点与它的父节点比较,若大于父节点则替换,直至不能向上替换

这个操作主要用于插入新元素到堆中

复杂度:O(logN)

堆的建造(建堆)

  1. 自顶向下建堆法
    • 对应的操作为插入堆和上滤
    • 将新元素放到堆的最后一位,然后对其进行上滤操作,直到所有元素插入后完成建堆
    • 复杂度:O(NlogN)
  2. 自下而上建堆法
    • 对应的操作为下滤
    • 将元素调整成堆,然后再对父节点进行下滤操作,具体操作从倒数第二排开始,对每个父节点进行下滤操作,直到根节点操作完毕
    • 复杂度:O(N)

优先队列

  1. 插入队列
    • 对应的就是上滤操作,直接将元素插入队尾
    • 复杂度:O(logN)
  2. 弹出最小元素
    • 这种队列可以用小根堆实现,因为小根堆的根节点本来就是最小元素,所以直接弹出根节点即可完成弹出操作,弹出后要将剩下的元素调整成堆,方法是将最后一节点放到根节点然后进行下滤操作。弹出的节点依次排序从小到大
    • 弹出复杂度:O(logN)

堆排序

建堆完成后,堆顶即最大值(大根堆)或最小值(小根堆),将堆顶与堆尾对调,对除堆尾之外的其他所有结点组成的树调用AdjustDown(向下调整[下滤])操作。完成后重复将堆顶与堆尾对调,再调用AdjustDown

直到树中只剩一个节点时,排序完成!

  • 排升序:建大堆
  • 排降序:建小堆
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值