区别于普通队列的先进先出,优先队列是优先级最大的先出队。其实把它理解成一个大根堆来使用就行。(C++中默认为大根堆,而Python中的堆为小根堆)
首先引入一下堆的概念:
大根堆,其根结点的值大于其任一子结点的值。小根堆则反之。
由这个概念我们可知,其左右子结点的大小顺序是没有规定的。因此我们要引入堆排序,使得堆中有序。(因为实际上写代码里我们也是可以让左节点小于或大于右节点的)
让我们来回忆一下堆排序:
以小根堆为例,我们输出堆顶元素(最小值)之后,使得剩余n-1个数重建成一个堆,则可得到这n个数的次小值。如此反复执行,就可以得到一个有序序列,这个过程称为堆排序。那么在这个过程中就需要解决两个问题:1.如何将无序序列建堆? 2.输出堆顶元素之后,如何调整剩余元素为一个新堆?
对于问题二来说,其实就是一个从堆顶至叶子的调整过程,输出堆顶元素之后,【用最后一个结点和堆顶元素交换位置】(那么此时这个更新后的最后一个结点就是堆中的一个最值,例如小根堆的话就是最小值),然后排除这个最值,再将剩下的二叉树自上而下不断选择左右儿子之间更小的那一位做交换,我们称之为筛选。而对于问题一,就是先将该序列表示成一棵完全二叉树,然后从最后一个非终端结点