创建大顶堆代码+时间复杂度详解+归纳过程!

一, 引入堆 \ 优先级队列

队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)

JDK1.8中的PriorityQueue底层使用了堆这种数据结构,而堆实际就是在完全二叉树的基础上进行了一些调整。

堆是一种完全二叉树的数据结构,可以分为大根堆和小根堆。在大根堆中,每个节点的值都大于或等于其子节点的值;在小根堆中,每个节点的值都小于或等于其子节点的值。堆排序就是基于这种结构而产生的一种程序算法。

二, 创建大顶堆的思路

1.堆的实现思路:

(1)将待排序的序列构造成一个大根堆(或小根堆)。
(2)将堆顶元素与堆底元素交换,并将堆的规模缩小1。
(3)对新的堆顶元素进行向下调整操作,使其重新成为大根堆(或小根堆)。
(4)重复步骤2和3,直到堆的规模为1。

2.大顶堆排序的详细步骤:

(1)构建堆:从最后一个非叶子节点开始,对每个节点进行向下调整操作,使其成为大根堆(或小根堆) 。
(2)排序:将堆顶元素与堆底元素交换,并将堆的规模缩小1。对新的堆顶元素进行向下调整操作,使其重新成为大根堆(或小根堆), 重复此过程,直到堆的规模为1。
(3)返回排序后的序列。

3.创建大顶堆的java代码如下(小顶堆即将大于号和小于号互换,这里不再赘述):

public class Heap {
   
    public int[] elem;
    public int usedSize;
    public Heap()
  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值