堆排序(Heap Sort)是一种基于二叉堆的排序算法。二叉堆是一种特殊的树形数据结构,通常可以看作
是一棵完全二叉树。在堆排序中,我们主要使用最大堆(或最小堆)来进行排序。这里,我将以最大堆为
例来详细讲解堆排序的过程。
1. 堆的定义
最大堆:对于任意一个节点 i(非根),其父节点 parent(i)的值都大于或等于该节点的值。最大
堆的根节点是整个堆中的最大值。
2. 堆排序的基本步骤
1. 建堆:将原始数组重新组织成一个最大堆。这一步通常从最后一个非叶子节点开始,逐步向上调
整堆的结构。
2. 堆顶元素与末尾元素交换:将堆顶元素(最大值)与末尾元素交换,这样最大值就被放到了正确
的位置(即数组的末尾)。
3. 调整堆:将剩下的 n-1 个元素重新调整为一个最大堆。
4. 重复步骤 2 和 3:直到堆中只剩下一个元素(即已经排序完成)。
3. 具体实现
3.1 建堆
从最后一个非叶子节点开始,向上逐步调整堆的结构。对于每个非叶子节点 i,如果它小于它的子
节点,则与较大的子节点交换,并继续向下调整其子树,直到满足最大堆的性质。
3.2 堆顶元素与末尾元素交换
将堆顶元素(即数组的第一个元素)与末尾元素交换。
3.3 调整堆
将交换后的末尾元素排除在外(即不再考虑该元素),将剩下的元素重新调整为一个最大堆。这
可以通过从新的根节点开始,向下逐步调整堆的结构来实现。
4. 示例