初学C++【6】:priority_queue的使用

区别于普通队列的先进先出,优先队列是优先级最大的先出队。其实把它理解成一个大根堆来使用就行。(C++中默认为大根堆,而Python中的堆为小根堆)

首先引入一下堆的概念

大根堆,其根结点的值大于其任一子结点的值。小根堆则反之。

由这个概念我们可知,其左右子结点的大小顺序是没有规定的。因此我们要引入堆排序,使得堆中有序。(因为实际上写代码里我们也是可以让左节点小于或大于右节点的)

让我们来回忆一下堆排序

以小根堆为例,我们输出堆顶元素(最小值)之后,使得剩余n-1个数重建成一个堆,则可得到这n个数的次小值。如此反复执行,就可以得到一个有序序列,这个过程称为堆排序。那么在这个过程中就需要解决两个问题:1.如何将无序序列建堆? 2.输出堆顶元素之后,如何调整剩余元素为一个新堆?

对于问题二来说,其实就是一个从堆顶至叶子的调整过程,输出堆顶元素之后,【用最后一个结点和堆顶元素交换位置】(那么此时这个更新后的最后一个结点就是堆中的一个最值,例如小根堆的话就是最小值),然后排除这个最值,再将剩下的二叉树自上而下不断选择左右儿子之间更小的那一位做交换,我们称之为筛选。而对于问题一,就是先将该序列表示成一棵完全二叉树,然后从最后一个非终端结点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值