堆排序
字数 877 2025-10-27 22:21:12

堆排序

题目描述:给定一个整数数组,使用堆排序算法将其按升序排列。

解题过程:

  1. 理解堆结构
    堆是一种特殊的完全二叉树,满足:
  • 最大堆:每个节点的值都大于或等于其子节点的值
  • 最小堆:每个节点的值都小于或等于其子节点的值
    堆排序使用最大堆来实现升序排序
  1. 算法步骤
    步骤1:构建最大堆
  • 从最后一个非叶子节点开始(索引为n/2-1),向前遍历到根节点
  • 对每个节点执行"堆化"操作,确保以该节点为根的子树满足最大堆性质

步骤2:排序过程

  • 将堆顶元素(最大值)与最后一个元素交换
  • 排除最后一个元素(已排序),对剩余部分重新堆化
  • 重复上述过程直到所有元素有序
  1. 详细实现过程
    以数组[4, 10, 3, 5, 1]为例:

构建最大堆:

  • 最后一个非叶子节点索引:5/2-1=1(节点10)
  • 从节点10开始堆化:比较10与其子节点5和1,10最大,无需调整
  • 处理节点4:比较4与其子节点10和3,10最大,交换4和10
  • 交换后数组变为[10, 4, 3, 5, 1]
  • 检查节点4的新位置:比较4与其子节点5,5更大,交换4和5
  • 最终最大堆:[10, 5, 3, 4, 1]

排序过程:

  • 交换堆顶10与末尾1:[1, 5, 3, 4, 10](10已排序)
  • 对前4个元素堆化:从根节点1开始,比较1与子节点5和3,5最大,交换1和5
  • 得到[5, 1, 3, 4, 10],继续堆化节点1,比较1与子节点4,交换1和4
  • 得到[5, 4, 3, 1, 10]
  • 交换堆顶5与当前末尾1:[1, 4, 3, 5, 10](5,10已排序)
  • 重复上述过程直到完全有序
  1. 关键操作:堆化函数
    堆化是维护堆性质的核心操作:
  • 比较当前节点与其左右子节点
  • 如果子节点更大,与最大的子节点交换
  • 递归处理被交换的子节点位置
  • 时间复杂度:O(log n)
  1. 复杂度分析
  • 时间复杂度:O(n log n)
  • 构建堆:O(n)
  • 每次提取最大值并重新堆化:O(log n),执行n-1次
  • 空间复杂度:O(1),原地排序

堆排序特别适合需要部分排序或实时排序的场景,是不稳定排序算法。

堆排序 题目描述:给定一个整数数组,使用堆排序算法将其按升序排列。 解题过程: 理解堆结构 堆是一种特殊的完全二叉树,满足: 最大堆:每个节点的值都大于或等于其子节点的值 最小堆:每个节点的值都小于或等于其子节点的值 堆排序使用最大堆来实现升序排序 算法步骤 步骤1:构建最大堆 从最后一个非叶子节点开始(索引为n/2-1),向前遍历到根节点 对每个节点执行"堆化"操作,确保以该节点为根的子树满足最大堆性质 步骤2:排序过程 将堆顶元素(最大值)与最后一个元素交换 排除最后一个元素(已排序),对剩余部分重新堆化 重复上述过程直到所有元素有序 详细实现过程 以数组[ 4, 10, 3, 5, 1 ]为例: 构建最大堆: 最后一个非叶子节点索引:5/2-1=1(节点10) 从节点10开始堆化:比较10与其子节点5和1,10最大,无需调整 处理节点4:比较4与其子节点10和3,10最大,交换4和10 交换后数组变为[ 10, 4, 3, 5, 1 ] 检查节点4的新位置:比较4与其子节点5,5更大,交换4和5 最终最大堆:[ 10, 5, 3, 4, 1 ] 排序过程: 交换堆顶10与末尾1:[ 1, 5, 3, 4, 10 ](10已排序) 对前4个元素堆化:从根节点1开始,比较1与子节点5和3,5最大,交换1和5 得到[ 5, 1, 3, 4, 10 ],继续堆化节点1,比较1与子节点4,交换1和4 得到[ 5, 4, 3, 1, 10 ] 交换堆顶5与当前末尾1:[ 1, 4, 3, 5, 10 ](5,10已排序) 重复上述过程直到完全有序 关键操作:堆化函数 堆化是维护堆性质的核心操作: 比较当前节点与其左右子节点 如果子节点更大,与最大的子节点交换 递归处理被交换的子节点位置 时间复杂度:O(log n) 复杂度分析 时间复杂度:O(n log n) 构建堆:O(n) 每次提取最大值并重新堆化:O(log n),执行n-1次 空间复杂度:O(1),原地排序 堆排序特别适合需要部分排序或实时排序的场景,是不稳定排序算法。