数据结构:堆Heap的理解
堆排序 参考帖子
堆的结构:
-
物理结构:一维数组,
-
逻辑结构:一颗完全二叉树,
- 只允许最后一行不为满;且最后一行必须从左往右排序;最后一行元素之间不可以有间隔
堆的特性:
- 堆序性:分小根堆和大根堆
- 大根堆中:每个父节点元素都要大于它的子节点元素
- 小根堆中:每个父节点元素都要小于它的子节点元素
堆的储存:
一个大根堆就可以用一个一维数组来描述
规律:节点下标为i
左子节点下标为 2i+1
右子节点下标为 2i+2

堆的基本操作:
- 下滤
来看一个案例:


以这个大根堆为例,根节点不符合堆序行,那么我们就会将这个根节点与它的子节点进行比较,如果小于它的子节点则与之交换,直至满足堆序性,这种将根节点向下替换的操作我们称为下滤操作
复杂度:O(logN)
- 上滤
上滤其实就是下滤相反,子节点有不符合堆序性的节点,则将该节点与它的父节点比较,若大于父节点则替换,直至不能向上替换
这个操作主要用于插入新元素到堆中
复杂度:O(logN)
堆的建造(建堆)
- 自顶向下建堆法
- 对应的操作为插入堆和上滤
- 将新元素放到堆的最后一位,然后对其进行上滤操作,直到所有元素插入后完成建堆
- 复杂度:O(NlogN)
- 自下而上建堆法
- 对应的操作为下滤
- 将元素调整成堆,然后再对父节点进行下滤操作,具体操作从倒数第二排开始,对每个父节点进行下滤操作,直到根节点操作完毕
- 复杂度:O(N)
优先队列
- 插入队列
- 对应的就是上滤操作,直接将元素插入队尾
- 复杂度:O(logN)
- 弹出最小元素
- 这种队列可以用小根堆实现,因为小根堆的根节点本来就是最小元素,所以直接弹出根节点即可完成弹出操作,弹出后要将剩下的元素调整成堆,方法是将最后一节点放到根节点然后进行下滤操作。弹出的节点依次排序从小到大
- 弹出复杂度:O(logN)
堆排序
建堆完成后,堆顶即最大值(大根堆)或最小值(小根堆),将堆顶与堆尾对调,对除堆尾之外的其他所有结点组成的树调用AdjustDown(向下调整[下滤])操作。完成后重复将堆顶与堆尾对调,再调用AdjustDown
直到树中只剩一个节点时,排序完成!
- 排升序:建大堆
- 排降序:建小堆
本文详细介绍了堆数据结构的物理与逻辑结构,大根堆和小根堆特性,以及基本操作如下滤、上滤和建堆。重点讲解了堆排序算法、优先队列的使用,包括插入与弹出操作。通过实例演示了堆序性维护和堆的构造方法。
8088

被折叠的 条评论
为什么被折叠?



