使用堆排序实现优先队列

本文介绍了如何使用二叉堆实现优先队列,详细解释了堆有序、完全二叉树和二叉堆的概念,并展示了插入元素和删除最大元素的过程。通过具体的整数优先队列实例,阐述了在N个输入中找出TopM个元素的方法,时间复杂度为O(NlogM),空间复杂度为O(M)。JDK中的PriorityQueue可以根据Comparator定义元素的排列顺序。
摘要由CSDN通过智能技术生成

优先队列,用二叉堆实现,元素在队尾追加,从队头删除。优先队列是怎么用二叉堆实现的呢?

首先了解几个概念:

  • 堆有序:在数组中,每个元素大于等于两个特定位置的元素。二叉树中,每个父节点的值要大于等于两个子节点的值
  • 完全二叉树:每个节点的子节点个数为2或0
  • 二叉堆:是一组能用堆有序的完全二叉树排序的元素,并在数组中按照二叉树的层序遍历顺序保存。
    在这里插入图片描述
    如果要将上图的二叉堆元素(节点数为N)保存在数组中,则需要创建一个长为N+1的数组,第0个元素不用,使用[1~N]保存节点。上述二叉堆按照层序遍历保存到数组中为[-,T,S,R,P,N,O,A,E,I,H,G],在此数组中,位置为k的节点的父节点为[k/2],两个子节点分别为[2k][2k+1]。
    在这里插入图片描述
    接下来来实现优先队列的两个主要操作:
    • 插入元素
      当有元素插入时放入堆数组的末尾,索引为k,如果当前元素大于其父节点[k/2],则需要和父节点交换位置,直至找到大于插入值的父节点为止,这种操作为“上浮”,即由下至上的堆有序化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值