首页 > web前端 > js教程 > 正文

什么是堆排序?堆排序的实现步骤

星降
发布: 2025-08-19 12:06:01
原创
491人浏览过
堆是一种特殊的完全二叉树,其中每个节点均大于(最大堆)或小于(最小堆)其子节点,堆排序通过构建和调整堆实现排序,首先将数组转化为最大堆,然后依次将堆顶最大值与末尾元素交换并重新堆化,直至有序;其时间复杂度为O(n log n),空间复杂度为O(1),属于原地不稳定排序,适用于大规模数据和内存受限环境。

什么是堆排序?堆排序的实现步骤

堆排序是一种基于二叉堆数据结构的排序算法。它利用堆的性质(最大堆或最小堆)来进行排序,效率较高。

堆排序的核心在于构建堆和调整堆。

构建堆的过程,就是把一个无序数组转换成一个堆结构。调整堆则是指,在堆顶元素发生变化后,如何维护堆的性质,使其仍然保持堆的结构。

如何理解堆排序的“堆”?

堆,本质上是一种特殊的完全二叉树。 想象一下,你面前有一棵树,每个节点都比它的子节点大(或者小)。这就是堆的核心概念。如果每个节点都比子节点大,我们称之为最大堆;反之,如果每个节点都比子节点小,则称为最小堆。

堆排序正是利用了这种特性。首先,我们将待排序的数组构建成一个堆。然后,将堆顶元素(最大堆中的最大值,或最小堆中的最小值)与数组末尾元素交换。接着,将堆的大小减一,并重新调整堆,使其满足堆的性质。重复这个过程,直到堆的大小为1,此时数组就完成了排序。

这种“先整体构建,再逐步调整”的思想,是堆排序的关键。

堆排序的详细实现步骤

  1. 构建堆(Build Heap):

    • 从最后一个非叶子节点开始(即数组长度/2 - 1),从后向前遍历数组。
    • 对每个节点执行“堆化”(Heapify)操作。
  2. 堆化(Heapify):

    • 比较当前节点与其子节点的值。
    • 如果当前节点小于(或大于,取决于最大堆或最小堆)其子节点中的较大(或较小)值,则交换它们。
    • 交换后,递归地对被交换的子节点执行堆化操作,直到满足堆的性质。
  3. 排序:

    bee餐饮点餐外卖小程序
    bee餐饮点餐外卖小程序

    bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置

    bee餐饮点餐外卖小程序 1
    查看详情 bee餐饮点餐外卖小程序
    • 将堆顶元素(最大值或最小值)与数组末尾元素交换。
    • 将堆的大小减一。
    • 对堆顶元素执行堆化操作,重新调整堆。
    • 重复以上步骤,直到堆的大小为1。

下面是一个使用Python实现最大堆排序的代码示例:

def heapify(arr, n, i):
    largest = i  # 初始化最大值为根节点
    l = 2 * i + 1  # 左子节点
    r = 2 * i + 2  # 右子节点

    # 如果左子节点存在且大于根节点
    if l < n and arr[i] < arr[l]:
        largest = l

    # 如果右子节点存在且大于根节点和左子节点
    if r < n and arr[largest] < arr[r]:
        largest = r

    # 如果最大值不是根节点
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # 交换
        heapify(arr, n, largest)  # 递归地堆化子树


def heap_sort(arr):
    n = len(arr)

    # 构建最大堆
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # 一个个从堆顶取出元素
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 交换
        heapify(arr, i, 0)


# 示例
arr = [12, 11, 13, 5, 6, 7]
heap_sort(arr)
print("排序后的数组:", arr)
登录后复制

这段代码首先定义了

heapify
登录后复制
函数,用于维护堆的性质。然后定义了
heap_sort
登录后复制
函数,用于执行堆排序。在
heap_sort
登录后复制
函数中,首先构建最大堆,然后逐步将堆顶元素与数组末尾元素交换,并重新调整堆。

堆排序的时间复杂度和空间复杂度是多少?

堆排序的时间复杂度是O(n log n),其中n是待排序数组的长度。构建堆的时间复杂度是O(n),每次调整堆的时间复杂度是O(log n),总共需要调整n-1次,所以总的时间复杂度是O(n log n)。

堆排序的空间复杂度是O(1),因为它是一种原地排序算法,只需要常数级的额外空间。

堆排序的优缺点是什么?

优点:

  • 效率较高: 平均和最坏情况下的时间复杂度都是O(n log n),比一些O(n^2)的排序算法(如冒泡排序、插入排序)效率更高。
  • 空间复杂度低: 只需要常数级的额外空间,是一种原地排序算法。
  • 稳定性: 堆排序是不稳定的排序算法。这意味着如果数组中有两个相等的元素,排序后它们的相对位置可能会发生改变。

缺点:

  • 实现相对复杂: 相比于一些简单的排序算法(如插入排序),堆排序的实现要复杂一些。
  • 不适合小规模数据: 对于小规模数据,堆排序的优势并不明显,甚至可能比插入排序更慢。因为构建堆需要一定的开销。

堆排序的应用场景有哪些?

堆排序在以下场景中比较适用:

  • 海量数据排序 当需要对大量数据进行排序时,堆排序的O(n log n)时间复杂度使其成为一个不错的选择。
  • 嵌入式系统: 由于堆排序是原地排序算法,只需要常数级的额外空间,因此在内存受限的嵌入式系统中比较适用。
  • 优先级队列: 堆数据结构本身就非常适合实现优先级队列。堆排序可以看作是使用堆来实现排序的一种方式。

总的来说,堆排序是一种高效、稳定的排序算法,在许多场景下都有着广泛的应用。理解堆排序的原理和实现步骤,对于提升算法能力和解决实际问题都非常有帮助。

以上就是什么是堆排序?堆排序的实现步骤的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号