【问题描述】
已知关键字序列(k1,k2,…,kn-1)是大顶堆,试编写算法实现将(k1,k2,…,kn-1,kn)调整为大顶堆,假设n最大值为20。
【输入形式】
输入一个大顶堆序列k1 k2 …kn-1,数值类型为整型,以空格分隔数据,回车结束。
输入kn值。
【输出形式】
输出k1,k2,…,kn-1,kn调整为大顶堆后的序列,数据之间以空格分隔。
【样例输入】
100 90 80 60 85 75
101
【样例输出】
101 90 100 60 85 75 80
C++代码
#include<iostream>
using namespace std;
void Pushdown(int first, int last, int A[]) {
int r = first;
while (r <= last / 2) //A[r]是叶子节点则退出循环
if (r == last / 2 && last % 2 == 0) { //A[r]有且仅有一个左儿子
if (A[r] < A[2 * r]) swap<int>(A[r], A[2 * r]);
r = last;
}
else if (A[r] < A[2 * r] && A[2 * r] >= A[2 * r + 1]) { //A[r]的左儿子 <= A[r]的右儿子,且小于A[r]
swap<int>(A[r], A[2 * r]);
r *= 2;
}
else if (A[r] < A[2 * r + 1] && A[2 * r + 1] > A[2 * r]) { //A[r]的右儿子 < A[r]的左儿子,且小于A[r]
swap<int>(A[r], A[2 * r + 1]);
r = 2 * r + 1;
}
else r = last;
}
int main() {
int temp, cnt = 1, A[20];
char eat = '\0';
while (eat != '\n') {
scanf("%d%c", &temp, &eat);
A[ cnt++] = temp;
}
cin >> A[cnt];
for (int i = cnt / 2; i >= 1; i--) {
Pushdown(i, cnt, A);
}
for (int i = 1; i < cnt+1; i++) cout << A[i] << " ";
return 0;
}