优先队列

优先队列应用和实现

优先队列其实就是完全二叉树,分为大顶堆小顶堆
大顶堆中所有的父节点都比子节点大,其堆顶的元素一定是这组元素的最大值;
小顶堆中所有的父节点都比子节点小,其堆顶的元素一定是这组元素的最小值。

ps. 完全二叉树:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。

优先队列的实现:由于堆实质是一颗完全二叉树,因此可以用数组方便地表示。构造一个堆时,有两种方法,一种是将元素依次插入,每次插入时都对此做相应的调整使其满足堆的性质,时间复杂度为O(nlogn)。另一种则是将一组无序的元素直接调整成堆,时间复杂度为O(n),我们用第二种方法。

例如我们要将一组元素1、2、3调整为大顶堆,如果最初1为根节点,2、3分别为左子节点和右子节点,为了使这组元素满足父节点大于任意子节点的规则,我们先将左孩子2与右孩子3进行比较,让父节点指向两者中的较大值3,然后再将根节点1与较大的孩子3进行比较,发现不满足父节点比子节点的大的性质,则将两者交换,即得3为根节点,1、2为子节点的大顶堆。
在元素更多的情况下也是如此,从下到上依次将所有的父节点与较大的子节点进行比较,如果不满足条件,就将父节点与子节点交换位置。

堆的插入
将一个元素插入堆中。因为堆必须是一颗完全二叉树,因此只需要将其元素直接插入堆尾,然后按照前面的介绍,依次调整,直到符合大顶堆或小顶堆的条件即可。

堆的删除
如果要将堆顶元素删除,则要把堆底的元素放入堆顶的位置,然后依次调整,直到符合大小关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值