堆(Heap)的相关知识学习

本文详细介绍了堆的基本概念,包括大堆和小堆的定义。接着,阐述了堆的主要操作,如向下调整和建堆的过程,并提供了相应的代码实现。最后,讨论了堆在优先级队列中的应用,包括入队、出队和返回队首元素的操作。
摘要由CSDN通过智能技术生成

堆(Heap)的相关知识学习

1、堆的概念

  1. 堆逻辑上是一棵完全二叉树
  2. 堆物理上是保存在数组中
  3. 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆
  4. 反之,则是小堆,或者小根堆,或者最小堆

2、堆的操作

(1)向下调整
过程(以小堆为例):

  1. index 如果已经是叶子结点,则整个调整过程结束
  2. 判断 index 位置有没有孩子
  3. 因为堆是完全二叉树,没有左孩子就一定没有右孩子,所以判断是否有左孩子
  4. 因为堆的存储结构是数组,所以判断是否有左孩子即判断左孩子下标是否越界,即 left >= size 越界
  5. 确定 left 或 right,谁是 index 的最小孩子 min
  6. 如果右孩子不存在,则 min = left
  7. 否则,比较 array[left] 和 array[right] 值得大小,选择小的为 min
  8. 比较 array[index] 的值 和 array[min] 的值,如果 array[index] <= array[min],则满足堆的性质,调整结束
  9. 否则,交换 array[index] 和 array[min] 的值
  10. 然后因为 min 位置的堆的性质可能被破坏,所以把 min 视作 index,向下重复以上过程

代码实现:

public static void adjustDown(int[] array, int size, int index) {
   
        while (true) {
   
            // 1. 判断 index 是不是叶子
            int leftIndex = 2 * index + 1;
            if (leftIndex >= size) {
   
                return;
            }

            // 2. 找最小的孩子
            int minIndex = leftIndex;
            int rightIndex = leftIndex + 1;
            if (rightIndex < size && array[rightIndex] < array[leftIndex]) {
   
                minIndex = rightIndex;
            }

            // 3. 比较最小孩子的值 和 index 位置的值
            if (array[index] <= array[minIndex]) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值