堆讲解

定义

堆就是用数组实现的完全二叉树,所以它没有使用父指针或者子指针。

  • 每个结点的值都⼤于或等于其左右孩⼦结点的值,称为最大堆
  • 每个结点的值都⼩于或等于其左右孩⼦结点的值,称为最小堆
    在这里插入图片描述
    注意:
    堆的根节点中存放的是最大或者最小元素,但是其他节点的排序顺序是未知的。
    在二叉树中搜索会很快,但是在堆中搜索会很慢。在堆中搜索不是第一优先级,因为使用堆的目的是将最大(或者最小)的节点放在最前面,从而快速的进行相关插入、删除操作。

什么是完全二叉树?
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
在这里插入图片描述
堆的常见用法 :

  • 构建优先队列
  • 支持堆排序
  • 快速找出一个集合中的最小值(或者最大值)

堆的实现

常用数组实现。和普通树相比,节省了大量空间
如果 i 是节点的索引,那么下面的公式就给出了它的父节点和子节点在数组中的位置:

parent(i) = floor((i - 1)/2)
left(i)   = 2i + 1
right(i)  = 2i + 2

在这里插入图片描述
常用函数有:Insert , pop

堆排序

要将堆转换成有序数组,需要使用堆排序。
过程:

  1. 构建最大堆后,堆顶元素一定是最大的,所以将堆顶元素放在数组最后,此时该元素已经处于正确位置
  2. 减小heapsize的值将该元素移除最大堆的范围,把原来在末尾的元素放到堆顶,因为堆顶的子树都符合最大堆性质,所以对堆顶进行修复得到新的最大堆
  3. 如此循环进行下去直到所有元素都在正确的位置上。

原文链接:
https://blog.csdn.net/qq_38555975/article/details/88874738
图片链接
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值