「数据结构」- 堆(优先级队列)

本文详细介绍了堆的概念,包括大堆和小堆的定义及其作用。通过下标关系阐述了堆的特性,并展示了如何在数组中实现堆。文章重点讨论了向下调整和建堆的过程,以及在添加、删除元素时如何维护堆的结构。此外,还介绍了堆排序的原理和步骤,强调了升序和降序排序中建堆的区别。
摘要由CSDN通过智能技术生成

目录

堆的认识

下标关系

准备工作

向下调整

建堆

实现

添加元素

删除元素

获取堆顶元素

堆为空判断

堆排序


堆的认识

  1. 堆逻辑上是一棵完全二叉树 , 物理上是保存在数组中

  2. 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆,反之,则是小堆,或者小根堆,或者最小堆

  3. 堆的基本作用是,快速找集合中的最值

 

下标关系

根据堆数组中每个下标,我们可以得出以下结论.

  1. 已知双亲(parent)的下标,则:

    • 左孩子(left)下标 = 2 * parent + 1

    • 右孩子(right)下标 = 2 * parent + 2

  1. 已知孩子 (不区分左右) (child)下标,则:

    • 双亲(parent)下标 = (child - 1) / 2

准备工作

通过上面我们得知 , 堆是使用数组来存储元素的,只是逻辑上是一颗树,所以我们先构造出个 Heap 类,这个类 用来实现 堆 的操作

public class Heap {
    public int[] elem;	// 存储数据的数组
    public int usedSize;// 记录当前堆中的有效数据

    public Heap(int[] array) {
        this.elem = array;     // 构造参数为一个数组作为参数传进来
        usedSize = array.length;// 这里假设数组元素全部为满的情况
    }
}

向下调整

向下调整:将所有子树是堆,而整棵树本身不是堆的给调整成堆

前提:左右子树必须已经是一个堆才能调整

// 调整前
int[] array = {27,15,19,18,28,34,65,49,25,37};

向下调整算法执行过程

 

//调整后
int[] array = {15, 18, 19,
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值