返回

堆排序原理与实现

前端

前言

在计算机科学的世界中,排序算法是必不可少的工具,用于以特定顺序安排数据。其中,堆排序以其高效性和易于理解的特性脱颖而出。本文旨在全面解析堆排序,从其基本原理到实际实现,帮助读者透彻理解这一算法。

二叉堆简介

堆排序的基础是二叉堆数据结构,它是一种完全二叉树,其中每个节点的值都比其子节点的值更大(对于最小堆)或更小(对于最大堆)。二叉堆的结构如下图所示:

         10
        /  \
       5   12
      / \   / \
     2   4 11  13

堆排序原理

堆排序的原理是将待排序数组转换为一个二叉堆,然后依次将堆的根节点(最大或最小值)取出,并将其插入数组的末尾。每取出一个根节点,都会破坏堆的性质,因此需要重新调整堆的结构以维护二叉堆的特性。

算法步骤

1. 构建堆:

  • 从待排序数组创建二叉堆。

2. 取出根节点:

  • 将堆的根节点(最大或最小值)取出并插入数组末尾。

3. 调整堆:

  • 调整堆的结构,使剩余节点重新满足二叉堆的性质。

4. 重复步骤 2 和 3:

  • 重复步骤 2 和 3,直到堆中只剩下一个元素。

代码实现

以下是用 Python 实现的堆排序算法:

def heap_sort(arr):
  """
  堆排序算法

  参数:
    arr: 待排序数组

  返回:
    已排序数组
  """

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

  # 依次取出根节点
  for i in range(len(arr) - 1, 0, -1):
    arr[i], arr[0] = arr[0], arr[i]
    heapify(arr, 0, i)

  return arr


def heapify(arr, i, n):
  """
  调整堆结构

  参数:
    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]
    heapify(arr, largest, n)

总结

堆排序算法以其高效性和易于理解的特性,在排序算法领域占有重要地位。通过将待排序数组转换为一个二叉堆,并依次取出根节点,我们可以高效地将数组排序。通过理解堆排序的原理和实现,我们可以深入掌握这一算法,并将其应用于实际场景中。