17
作者:
xxdmd8
,
2024-12-20 18:50:07
,
所有人可见
,
阅读 6
大顶堆调整
【问题描述】已知关键字序列(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
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100010;
int n;
int h[N];
int cnt;
void down(int u){
int t = u;
if(2*u <= cnt && h[t] < h[2*u]) t = 2*u;
if(2*u + 1 <= cnt && h[t] < h[2*u + 1]) t = 2*u + 1;
if(u != t){
swap(h[u],h[t]);
down(t);
}
}
int main(){
for(int i = 1;;i ++){
scanf("%d",&h[i]);
if(h[i] == 0) break;
cnt ++;
}
n = cnt;
//cout << n;
for(int i = n/2; i; i --) down(i);
for(int i = 1;i <= cnt;i ++){
cout << h[i] << " ";
}
return 0;
}