图解大顶堆的构建、排序过程

一、堆的基本概念

堆是一种非线性结构,可以看作是一棵二叉树,也可以表示为一个数组。简而言之,堆就是利用完全二叉树的结构来维护的一维数组。

堆分为大顶堆小顶堆两种类型:

  • 大顶堆:每个节点的值都大于或等于其左右孩子节点的值。
  • 小顶堆:每个节点的值都小于或等于其左右孩子节点的值。

在排序算法中:

  • 升序排序使用大顶堆。
  • 降序排序使用小顶堆。

对于Top K问题,也可以用堆来实现:

  • 最大的 K 个元素:使用小顶堆。
  • 最小的 K 个元素:使用大顶堆。
二、大顶堆的构建过程

大顶堆的构建过程从最后一个非叶子节点开始,从下往上进行调整。

如何找到最后一个非叶子节点?
假设用数组表示待排序的序列,则最后一个非叶子节点的位置是:数组长度/2 - 1
例如,若数组长度为9,则最后一个非叶子节点的位置是:9/2 - 1 = 3

调整过程

  1. 比较当前节点与左子树的值
    • 如果当前节点小于左子树的值,交换两者的位置。
    • 交换后,检查左子树是否满足大顶堆的性质,不满足则重新调整子树结构。
  2. 比较当前节点与右子树的值
    • 如果当前节点小于右子树的值,交换两者的位置。
    • 交换后,检查右子树是否满足大顶堆的性质,不满足则重新调整子树结构。

当无需交换时,大顶堆的构建完成。

图解:以数组 [3, 7, 16, 10, 21, 23] 为例,展示大顶堆的构建过程。

三、大顶堆的排序过程

排序过程概括如下:

  1. 构建大顶堆:将无序序列构造成大顶堆。
  2. 交换根节点与末尾元素:最大值(堆顶)与末尾元素交换,此时末尾元素为最大值。
  3. 重新构建大顶堆:将剩余的 n-1 个元素重新构建成大顶堆。
  4. 重复步骤2和3:直到整个序列排序完成。

总结: 以上过程反复执行,最终将一个无序的数组排序为一个有序序列。

原文链接:https://www.cnblogs.com/sunshineliulu/p/12995910.html​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sagima_sdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值