找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 20|回复: 0

堆排序

[复制链接]
发表于 2025-4-5 17:15:53 | 显示全部楼层 |阅读模式
堆排序是一种基于比较的排序算法,它利用数据结构中的堆(Heap)来实现排序。堆是一个完全二叉树,分为最大堆和最小堆。对于最大堆,父节点的值总是大于或等于它的子节点的值;最小堆则相反。堆排序通常采用最大堆来进行排序。
算法步骤堆排序的主要步骤可以分为两部分:构建堆和排序。
  • 构建最大堆

    • 从最后一个非叶节点开始,一直向上调整每个节点,确保每个节点都满足最大堆的性质。
    • 对于一个数组,最后一个非叶节点的索引是 n/2 - 1(其中 n 是数组的长度)。
  • 进行排序

    • 逐步将最大堆的根节点(最大元素)与堆的最后一个元素进行交换。
    • 将堆的大小减1(即忽略最后一个元素),然后对新根节点进行“堆化”操作,以恢复最大堆性质。
    • 重复该过程,直到堆的大小为1。
示例考虑数组:[3, 5, 1, 10, 2],使用堆排序的过程如下:
  • 构建最大堆

    • 使用后续调整得到堆:
            10      /    \     5      3    / \    /   1   2  0
  • 排序过程

    • 第一次:交换 10(根节点)和最后的 2,得到 [2, 5, 1, 3, 10],然后堆化 [2, 5, 1, 3]:
            5      /   \     3     1
    • 第二次:交换 5 和 1,得到 [1, 2, 3, 5, 10],堆化 [1, 2, 3]:
            3      /   \     2     1
    • 继续重复上述步骤,直到完成排序。
最终得到排序后的数组:[1, 2, 3, 5, 10]
特点
  • 时间复杂度
    • 最坏情况、平均情况和最好情况均为 (O(n \log n))。
  • 空间复杂度:(O(1))(原地排序,不需要额外的存储空间)。
  • 不稳定性:堆排序不是稳定的,等值元素的相对顺序可能会改变。
应用场景
  • 适合大规模数据排序。
  • 常用于需要快速排序且不在乎稳定性的场景,例如大数据处理。
如果你需要更详细的代码实现或示例,随时问我!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|星星学习网

GMT+8, 2025-4-22 08:32 , Processed in 0.091751 second(s), 13 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表