参见《算法笔记》–胡凡
一、了解堆
介绍
![](https://i-blog.csdnimg.cn/blog_migrate/c904176d1fe89206153e7baede9bcbff.png)
数组存放
![](https://i-blog.csdnimg.cn/blog_migrate/ab465307675e421a0488e6560b542968.png)
注意: 这里面说根节点不能存在0位置,应该是想说当子节点满足2x和2x+1这种规律时;而不是说不能,如果是0的话,规律变为2x+1和2x+2了。
修订:根节点确实不适合用0,例如当你在进行添加操作时,你添加后需要向上调整,此时需要判断是否为奇偶数才能获得父节点的下标,奇数除以2,而偶数需要除以2再减一。但对于根节点为1的,无论奇偶,只需要除以2即可。
实现思路
核心思想:编写调整函数,调整函数有两个方向,从上往下(用于构建堆,排序,删除节点)或者从下往上(用于添加节点)。大体举例如下
…以此类推
二、实现堆(大顶堆为例,即书中所说)
向下调整函数
![](https://i-blog.csdnimg.cn/blog_migrate/8888a6a5ac15457b952352b115a2508c.png)
构建和删除操作
![](https://i-blog.csdnimg.cn/blog_migrate/c7e6e78428a097e6b1345715de311f4c.png)
向上调整函数和添加操作
![](https://i-blog.csdnimg.cn/blog_migrate/288fc9c0576b0a3401b4bf4468c54496.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0ddd6350d25c1ce0685097dc376356d2.png)
实现堆排序
三、PriorityQueue
优先队列,Java中集合,默认实现小顶堆,我们只需要通过add添加元素,即可获得小顶堆。每次poll相当于移除堆顶元素,即最小值。如果看源码的话,就知道里面的核心同样是调整函数,如shiftDown,shiftUp等,它们在操作堆时同样会被调用。
四、练习
排序题目汇总 215、347、451