目录
堆、堆排序、优先队列可以看成就是一个东西;堆是一种非常重要的数据结构,堆排序是基于堆这种数据结构实现的;优先队列可以用堆这种数据结构来实现,也可以用其他数据结构实现。
优先队列可以用来实现有优先级的任务调用(一些任务在池子里等待,优先级最高的先被优先取出执行)
堆的概念和性质:
堆:
堆是一棵完全二叉树,满足以下性质:
最大堆(Max Heap):
在最大堆中,父节点的值总是大于或等于其子节点的值。
因此,最大堆的根节点是堆中的最大值。
最小堆(Min Heap):
在最小堆中,父节点的值总是小于或等于其子节点的值。
因此,最小堆的根节点是堆中的最小值。
完全二叉树:
除了最底层外,其他每一层的节点都被填满,且最底层从左到右填充。这种结构使得堆可以通过数组高效地实现。对于父节点索引为i的节点,其左子节点的索引为2i+1,右子节点的索引为2i+2。同样地,对于子节点索引为j的节点,其父节点的索引为(j-1)/2。
| left | 2*i+1 |
| right | 2*i+2 |
| parent | (i-1)/2 |
图解用数组表示堆:

上图中从根节点开始一层一层从左到有遍历(广度优先),就得到0到14 的有序数组 , 父节点、左右子节点满足表格中的计算关系。
图解最小堆节点插入(堆的构造过程):
1.将新元素直接插入到树的最底层最后一个位置(也就是数组的最后一个位置)
2.检查是否满足最小堆的性质:父节点的值总是小于或等于其子节点的值
3.如下图依次插入4到55,发现都满足最小堆的性质。

4.继续插入6,不满足最小堆的性质,6和父节点50互换。</

1860

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



