OlveraeUNSW
返回题目列表
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