初始数组
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}