返回题目列表
COMP2521
堆 · 删除堆顶并下沉
堆 · 删除堆顶并下沉(堆排序)
先按输入顺序把整数建成一棵最大堆(insert 已给好),然后反复执行「删除最大」,每次把取出的最大值打印出来,直到堆空。由于每次取走的都是当前最大值,输出自然是从大到小排好的——这正是「堆排序」。
请补全 delMax(下沉 sift-down):取出 h[0] 作为返回值,把末尾元素填到堆顶并令 *n 减一,然后从 index 0 开始下沉——在左、右两个孩子里挑出较大的那个,若它比当前节点大就交换、继续往下,直到比两个孩子都大或没有孩子。
易错点:下沉必须在左右两个孩子里取较大者再比,只跟左孩子比会破坏堆性质;末尾填到堆顶后要记得 (*n)--,否则旧末尾会变成幽灵元素被重复取出。输入
- 第 1 行:整数
n(可能为 0)。 - 第 2 行:
n个整数,按此顺序插入建堆。
输出
- 一行:依次「删除最大」得到的值(即从大到小),每个值后跟一个空格。
示例:输入 7 / 50 30 70 20 40 60 80 → 输出 80 70 60 50 40 30 20 。
样例
stdin
7 50 30 70 20 40 60 80
期望输出
80 70 60 50 40 30 20
stdin
1 42
期望输出
42
c-dcc
14