什么是堆?

堆又称为优先队列,但堆并不是队列
优先队列:一种特殊的队列,队列中元素出栈的顺序是按照元素的优先权大小的,而不是元素入队的先后顺序。

死磕算法-堆
堆的特性

  1. 必须是完全二叉树
  2. 用数组实现
  3. 任一节点的值是其子树所有结点的最大值或最小值
    • 最大值时,称为"最大堆",也称大根堆
    • 最小值时,称为"最小堆",也称小根堆

大根堆

死磕算法-堆
小根堆
死磕算法-堆

对于堆这种数据结构,从根节点到任意结点路径上所有的结点都是有序的

堆的实现

堆的经典实现是完全二叉树,这样实现的堆称为二叉堆。

完全二叉树是增加了限定了条件的二叉树。假设一个二叉树的深度为n,为了满足完全二叉树的要求,该二叉树的前n-1层必须填满,第n层也必须按照从左到右的顺序被填满,比如下图:

死磕算法-堆

**实际中二叉树是数组实现的。**假设数组中包含N个元素,取第一个元素为根节点,则该根结点的子左结点为(2i+1),子右结点为(2i+2),即第i个元素的子结点分别为(2i+1)和(2i+2)。

死磕算法-堆

插入

每次总是先填满上一层,再在下一层从左往右一次插入,堆的插入步骤:

  1. 将新的元素增加到堆的末尾
  2. 按照优先顺序,将新元素与父节点比较,如果新元素大于父节点则两者交换位置
  3. 不断进行第二步,直到不需要交换新元素和父节点,或者达到堆顶
  4. 最终得到大根堆

通过将新元素与父节点调整交换的操作叫做上滤

死磕算法-堆

删除

堆的删除与插入操作相反,删除操作从上往下调整堆

  1. 删除堆顶元素,通常是将堆顶元素放置在数组的末尾
  2. 比较左右节点,将大的元素上调
  3. 不断进行步骤二

上述调整方法称为下滤

死磕算法-堆

相关文章: