堆的创建和基本操作

本文介绍了堆的概念,包括小堆和大堆的定义,以及堆作为完全二叉树的存储方式。堆的创建可以通过两种方法实现,插入元素或堆化数组。堆的基本操作涉及插入元素时的向上调整和删除堆顶元素时的向下调整,确保堆的性质得以保持。此外,文章还澄清了在删除堆顶元素时的常见误解。
摘要由CSDN通过智能技术生成
1、堆的概念

如果有一个关键码的集合 K={K0,K1,K2,…,Kn-1},把所有完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i +1 且 Ki <= K2i + 2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

堆的性质:

  • 堆中每个节点的值总是不大于或不小于其父节点的值;

  • 堆是一棵完全二叉树

    在这里插入图片描述

2、堆的存储方式

二叉堆是一棵完全二叉树,所以很容易用数组表示,因为一棵高度为 h 的完全二叉树有 2h到 2(h+1)-1个节点,用数组存放一个二叉堆就不会太浪费空间,而且一旦知道高度,就可以知道节点数的范围。而且非常节省存储空间。因为不需要存储左右子节点的指针,单纯通过数组的下标就可以找到一个节点的左右子节点和父节点。

假设i为节点在数组中的下标,则有:
如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为 (i - 1)/2
如果2 * i + 1 小于节点个数,则节点i的左孩子下标为2 * i + 1,否则没有左孩子
如果2 * i + 2 小于节点个数,则节点i的右孩子下标为2 * i + 2,否则没有右孩子

3、堆的创建

将数组"原地"的建成一个堆,不借助辅助空间
方式一:利用在堆中插入元素的思路,尽管数组中包含 n 个元素,可以假设起初堆中只包含一个数据,就是下标为 1 的数据。然后调用插入操纵,将下标从 2 大牌 n 的数据依次插入到堆中,这样就将包含 n 个数据的数组,组织成堆。

方式二:对一组普通的序列向上调整或者向下调整从而形成堆,这个过程可以称为“堆化”(堆化就是顺着节点所在路径,向上或向下对比然后交换)。
在这里插入图片描述
对以下序列{7 5 19 8 4 1 20 13 16} 画图理解向上调整的过程
以下图中关于堆中的数据都是从数组下标为 1 的位置开始存储的,所以注意左右孩子和父节点的计算其实也可以从 0 开始,处理思路不变,只是代码实现的时候计算子节点和父节点的下标公式发生变化了。如果节点的下标是 i,那左子节点的下标就是 2i+1,右子节点的下标就是 2i+2,父节点的下标就是 (i-1)/2。
在这里插入图片描述
在这里插入图片描述
代码实现:


private static void buildHeap(int[] a, int n) {
   
  for (int i = n/2; i >= 1; --i) {
   
    heapify(a, n, i);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值