码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 堆排序代码模板


     

     

    1. #include
    2. using namespace std;
    3. const int N = 1e5 + 9;
    4. int h[N], n, m, Size;//小根堆
    5. //u表示三个点中的根节点
    6. void down(int u)
    7. {
    8. int t = u;//设t为三个点中最小的那个点
    9. //如果左儿子存在并且小于根节点就将左儿子赋值给t
    10. if (u * 2 <= Size && h[u * 2] < h[t]) t = u * 2;
    11. //右儿子
    12. if (u * 2 + 1 <= Size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
    13. //如果传入的节点不是最小值就交换
    14. if (u != t)
    15. {
    16. swap(h[u], h[t]);
    17. down(t);//将原本的根节点沉下来
    18. }
    19. }
    20. int main()
    21. {
    22. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    23. cin >> n >> m;
    24. //开始创建堆的时候,元素是随机插入的,所以不能从根节点开始down
    25. //而是要找到满足下面三个性质的结点:
    26. //1.左右儿子满足堆的性质。
    27. //2.下标最大(因为要往上遍历)
    28. //3.不是叶子节点(叶子节点一定不满足堆的性质)
    29. for (int i = 1; i <= n; ++i) cin >> h[i];
    30. Size = n;
    31. //时间复杂度为O(n)
    32. //在堆中,每个节点的左子节点的下标为2i,右子节点的下标为2i+1
    33. //假设堆中有n个节点,下标从1到n。我们知道叶子节点是没有子节点的
    34. //所以最后一个非叶子节点的下标一定小于等于n/2。
    35. //首先要明确要进行down操作时必须满足左儿子和右儿子已经是个堆
    36. for (int i = n / 2; i; --i) down(i);
    37. //应该是不能从头往下down吧,down操作是把小数扔上来
    38. //大数扔下去,从头往下down把第一个三角里的最小值扔到第一个位置
    39. //就不再管他了,但是并不能保证其能小于剩下的所有值
    40. //但从下往上down可以保证建堆时全部点完全从小到大
    41. //for (int i = 1; i <= n; i++) down(i);//错误
    42. //for (int i = n; i >= 0; i--) down(i);//正确
    43. //for (int i = n / 2; i >= 0; i--) down(i);//也正确
    44. while (m--)
    45. {
    46. //本题输出最小值需要删除前面的最小值
    47. //原本查询最小值只需要h[1],但是现在是前m个数
    48. //所以需要用到删除第一个数的方法
    49. cout << h[1] << " ";
    50. h[1] = h[Size--];
    51. down(1);//将原本在最后的节点往下沉
    52. }
    53. return 0;
    54. }

  • 相关阅读:
    C程序设计(第五版) 第一章节 程序设计和C语言
    手写raft(一) 实现leader选举
    信息系统项目管理师(第四版)教材精读思维导图-第十章项目进度管理
    微服务实战声明式服务调用OpenFeign实践
    【PAT甲级 - C++题解】1081 Rational Sum
    【iOS安全】iOS ARM汇编
    前端JavaScript中异步的终极解决方案:async/await
    软件设计原则-依赖倒置原则讲解以及代码示例
    【2023最新版】腾讯云CODING平台使用教程(Pycharm/命令:本地项目推送到CODING)
    日语_和方位相关的词
  • 原文地址:https://blog.csdn.net/qq_73185160/article/details/133895265
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号