AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

17

作者: 作者的头像   xxdmd8 ,  2024-12-20 18:50:07 ,  所有人可见 ,  阅读 9


0


大顶堆调整
【问题描述】已知关键字序列(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;
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息