现有一整型数组,a[8] = { 4,8,7,0,3,5,9,1},现使用堆排序的方式原地对该数组进行升序排列。那么在进行第一轮排序结束之后,数组的顺序为?

初始数组

cpp 复制代码
a[8] = {4, 8, 7, 0, 3, 5, 9, 1}

构建最大堆(从最后一个非叶子节点开始)

数组看作完全二叉树:

复制代码
            4
         /     \
       8         7
     /   \     /   \
    0     3   5     9
   /
  1

Step 1:堆化 index=3(0 和子节点 1)

  • 0 < 1 → 交换

    复制代码
              4
           /     \
         8         7
       /   \     /   \
      1     3   5     9
     /
    0

数组变为:

cpp 复制代码
{4, 8, 7, 1, 3, 5, 9, 0}

Step 2:堆化 index=2(7 和子节点 5, 9)

  • 9 最大 → 交换 7 和 9

    复制代码
              4
           /     \
         8         9
       /   \     /   \
      1     3   5     7
     /
    0

数组变为:

cpp 复制代码
{4, 8, 9, 1, 3, 5, 7, 0}

Step 3:堆化 index=0(4 和子节点 8, 9)

  • 9 最大 → 交换 4 和 9

  • 然后堆化 index=2(4 和子节点 5, 7)→ 7 最大 → 再交换

    复制代码
              9
           /     \
         8         7
       /   \     /   \
      1     3   5     4
     /
    0

数组变为:

cpp 复制代码
{9, 8, 7, 1, 3, 5, 4, 0}

最大堆构建完成:

cpp 复制代码
{9, 8, 7, 1, 3, 5, 4, 0}

Step 4:第一轮排序(交换最大值与末尾,再堆化)

  • 交换 9 与 0,堆大小变为 7

    复制代码
              0
           /     \
         8         7
       /   \     /   \
      1     3   5     4
  • 堆化 index=0 → 与8交换 → {8, 0, 7, 1, 3, 5, 4, 9}

  • 再堆化 index=1 → 与3交换 → {8, 3, 7, 1, 0, 5, 4, 9}

    复制代码
              8
           /     \
         3         7
       /   \     /   \
      1     0   5     4

第一轮后数组:

cpp 复制代码
{8, 3, 7, 1, 0, 5, 4, 9}

Step 5:第二轮排序(交换堆顶8与末尾4)

  • 交换后:{4, 3, 7, 1, 0, 5, 8, 9}

堆化:

  • index=0 → 与7交换 → {7, 3, 4, 1, 0, 5, 8, 9}

  • index=2 → 与5交换 → {7, 3, 5, 1, 0, 4, 8, 9}

    复制代码
              7
           /     \
         3         5
       /   \     /   
      1     0   4

第二轮后数组:

cpp 复制代码
{7, 3, 5, 1, 0, 4, 8, 9}

Step 6:第三轮(堆顶7与末尾4交换)

  • 交换后:{4, 3, 5, 1, 0, 7, 8, 9}

  • 堆化 index=0 → 与5交换 → {5, 3, 4, 1, 0, 7, 8, 9}

    复制代码
              5
           /     \
         3         4
       /   \   
      1     0

第三轮后数组:

cpp 复制代码
{5, 3, 4, 1, 0, 7, 8, 9}

Step 7:第四轮(堆顶5与末尾0交换)

  • 交换后:{0, 3, 4, 1, 5, 7, 8, 9}

  • 堆化 index=0 → 与4交换 → {4, 3, 0, 1, 5, 7, 8, 9}

    复制代码
              4
           /     \
         3         0
       /   
      1

第四轮后数组:

cpp 复制代码
{4, 3, 0, 1, 5, 7, 8, 9}

Step 8:第五轮(堆顶4与末尾1交换)

  • 交换后:{1, 3, 0, 4, 5, 7, 8, 9}

  • 堆化 index=0 → 与3交换 → {3, 1, 0, 4, 5, 7, 8, 9}

    复制代码
              3
           /     \
         1         0

第五轮后数组:

cpp 复制代码
{3, 1, 0, 4, 5, 7, 8, 9}

Step 9:第六轮(堆顶3与末尾0交换)

  • 交换后:{0, 1, 3, 4, 5, 7, 8, 9}

  • 堆化 index=0 → 与1交换 → {1, 0, 3, 4, 5, 7, 8, 9}

    复制代码
              1
           /     \
         0         3

第六轮后数组:

cpp 复制代码
{1, 0, 3, 4, 5, 7, 8, 9}

Step 10:第七轮(堆顶1与末尾0交换)

  • 交换后就是:
cpp 复制代码
{0, 1, 3, 4, 5, 7, 8, 9}

无需再堆化,排序完成


最终升序数组:

cpp 复制代码
{0, 1, 3, 4, 5, 7, 8, 9}

所以,第一轮排序结束后的数组为:

cpp 复制代码
{8, 3, 7, 1, 0, 5, 4, 9}
相关推荐
Evand J3 分钟前
【电机滤波例程1】PMSM永磁同步电机转速与位置估计,MATLAB程序:标准无迹卡尔曼滤波、模型说明与仿真验证
算法·matlab·电机·ekf·负载·卡尔曼滤波
打码的老程是远篁21 分钟前
手把手教你玩转大模型——3. Transformer 的位置编码——模型怎么知道谁在前,谁在后?
人工智能·算法
嘎嘎风22 分钟前
MiniMind 学习笔记之 06 一张图、一百行:MiniMind 的骨架
算法·源码
用户73416810354825 分钟前
只盯被动响应做状态监测?论“控制信号”在变工况故障诊断中的重要作用
算法
Ivanqhz28 分钟前
MQA、GQA、稀疏/滑动窗口注意力及混合范式
人工智能·算法·机器学习
罗湖老棍子36 分钟前
荒岛野人(信息学奥赛一本通- P1637)(洛谷-P2421)
算法·数论·枚举·裴蜀定理·扩展欧几里得·扩展中国剩余定理
朝朝辞暮i41 分钟前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
400分1 小时前
具身智能系列之从零到「机械臂会放试管」:π0.5 VLA 真机部署完全指南【第一节】
算法
小宋10211 小时前
一套服务托管多个 LoRA:适配器加载、租户隔离与热切换实战
大数据·人工智能·算法
Rosanci1 小时前
Codex 下载与本地部署实战:从安装到运行全流程指南
开发语言·前端·算法·chatgpt·codex