1. 堆排序算法概述
堆排序是一种基于完全二叉树结构的经典排序算法,由J. W. J. Williams在1964年提出。它巧妙地利用了大顶堆(Max Heap)或小顶堆(Min Heap)的特性,通过不断调整堆结构来实现排序。与快速排序和归并排序相比,堆排序在最坏情况下仍能保持O(n log n)的时间复杂度,这使得它在处理大规模数据时表现稳定。
在实际工程中,堆排序常用于需要保证最坏情况性能的场景,比如实时系统、游戏开发中的优先级队列,以及内存受限环境下的排序任务。Python内置的heapq模块虽然提供了堆操作的基本函数,但理解底层原理对于解决复杂问题至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 堆结构核心原理
2.1 完全二叉树特性
堆本质上是一棵完全二叉树,这意味着除了最后一层外,其他层的节点都必须完全填满,且最后一层的节点都集中在左侧。这种结构可以用数组高效表示:
- 对于任意节点i(从0开始计数):
- 父节点位置:(i-1)//2
- 左子节点:2*i + 1
- 右子节点:2*i + 2
这种数组表示法省去了指针存储空间,使得堆成为内存效率极高的数据结构。例如一个数组[3, 8, 5, 10, 9]对应的堆结构为:
code复制 10
/ \
9 5
/ \
3 8
2.2 堆的性质
大顶堆需要满足每个节点的值都大于或等于其子节点的值(小顶堆则相反)。这个性质保证了堆顶元素始终是最大值(或最小值)。维护这个性质的关键操作是堆化(Heapify),包括:
- 上浮(Shift Up):当新元素插入堆末尾时,与其父节点比较并逐级上移
- 下沉(Shift Down):当堆顶元素被移除后,将末尾元素移到堆顶并逐级下移
堆化操作的时间复杂度为O(log n),因为最坏情况下需要从根节点移动到叶子节点,而完全二叉树的高度是⌊log₂n⌋。
3. 堆排序实现步骤
3.1 建堆过程
将无序数组构建成堆有两种方法:
- 自顶向下法:逐个插入元素,每次插入后执行上浮操作。时间复杂度O(n log n)
- 自底向上法:从最后一个非叶子节点开始向前遍历,对每个节点执行下沉操作。这种方法更高效,时间复杂度可证明为O(n)
Python实现
