数据结构与算法之排序算法 堆排序 大顶堆 / 小顶堆 构建与调整

数据结构与算法阿木 发布于 2025-07-12 13 次阅读


堆排序:数据结构与算法中的高效排序算法

在计算机科学中,排序算法是数据结构算法领域的一个重要分支。它涉及到将一组无序的数据元素按照一定的顺序排列成有序序列。堆排序(Heap Sort)是一种基于比较的排序算法,它利用堆这种数据结构所设计的一种排序算法。堆排序的时间复杂度为O(nlogn),在所有排序算法中表现较为出色,尤其适用于大规模数据的排序。

本文将围绕堆排序中的数据结构与算法,详细介绍大顶堆和小顶堆的构建与调整过程,并给出相应的代码实现。

堆排序的基本原理

堆排序是一种利用堆这种数据结构进行排序的算法。堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或大于)它的父节点。

在堆排序中,我们主要关注两种堆:大顶堆和小顶堆。

- 大顶堆:每个父节点的值都大于或等于其子节点的值。

- 小顶堆:每个父节点的值都小于或等于其子节点的值。

堆排序的基本思想是:将待排序的序列构造成一个大顶堆,然后交换堆顶元素(最大值)与最后一个元素,将剩余的n-1个元素重新构造成一个大顶堆,重复此过程,直到整个序列有序。

大顶堆的构建与调整

构建大顶堆

构建大顶堆的过程如下:

1. 从最后一个非叶子节点开始,将其与子节点进行比较,若父节点小于子节点,则交换它们的位置。

2. 对父节点进行同样的操作,直到整个序列满足大顶堆的性质。

以下是构建大顶堆的Python代码实现:

python

def build_max_heap(arr):


n = len(arr)


for i in range(n // 2 - 1, -1, -1):


max_heapify(arr, i, n)


return arr

def max_heapify(arr, i, n):


largest = i


left = 2 i + 1


right = 2 i + 2

if left < n and arr[left] > arr[largest]:


largest = left

if right < n and arr[right] > arr[largest]:


largest = right

if largest != i:


arr[i], arr[largest] = arr[largest], arr[i]


max_heapify(arr, largest, n)


调整大顶堆

在堆排序过程中,每次交换堆顶元素与最后一个元素后,需要调整剩余的n-1个元素,使其重新满足大顶堆的性质。调整过程如下:

1. 将堆顶元素与最后一个元素交换。

2. 将剩余的n-1个元素视为一个新的大顶堆,重复构建大顶堆的过程。

以下是调整大顶堆的Python代码实现:

python

def heap_sort(arr):


n = len(arr)


build_max_heap(arr)


for i in range(n - 1, 0, -1):


arr[i], arr[0] = arr[0], arr[i]


max_heapify(arr, 0, i)


return arr


小顶堆的构建与调整

小顶堆的构建与调整过程与大顶堆类似,只是比较条件相反。以下是构建小顶堆的Python代码实现:

python

def build_min_heap(arr):


n = len(arr)


for i in range(n // 2 - 1, -1, -1):


min_heapify(arr, i, n)


return arr

def min_heapify(arr, i, n):


smallest = i


left = 2 i + 1


right = 2 i + 2

if left < n and arr[left] < arr[smallest]:


smallest = left

if right < n and arr[right] < arr[smallest]:


smallest = right

if smallest != i:


arr[i], arr[smallest] = arr[smallest], arr[i]


min_heapify(arr, smallest, n)


以下是调整小顶堆的Python代码实现:

python

def min_heap_sort(arr):


n = len(arr)


build_min_heap(arr)


for i in range(n - 1, 0, -1):


arr[i], arr[0] = arr[0], arr[i]


min_heapify(arr, 0, i)


return arr


总结

本文详细介绍了堆排序中的数据结构与算法,包括大顶堆和小顶堆的构建与调整过程。通过Python代码实现,我们可以看到堆排序在构建和调整堆的过程中,如何有效地对数据进行排序。堆排序是一种高效的排序算法,在实际应用中具有广泛的应用前景。