5.20


前言吐槽:

  • 今天是5.20啦,但是作为单身修狗的我只能和代码过啦。。。继续加油算法打卡!!!

堆排序:

  • 堆就是一棵完全二叉树

  • 二叉堆是一种支持插入,删除,查询最值的数据结构。他其实是一棵满足"堆性质"的完全二叉树,树上的每个节点带有一个权值。若树中的任意一个节点的权值都小于等于其父节点的权值,则称该二叉树满足"大根堆性质”。若树中任意一个节点的权值都大于等于其父节点的权值,则称该二叉树满足"小根堆性质”。

  • 这里采用一个数组来保存二叉堆。逐层从左到右为树中的节点依次编号,把此编号作为节点在数组中存储的位置(下标)。在这种存储方式中,父节点编号等于子节点编号除以2,左子节点编号等于父节点编号乘2,右子节点编号等于左子节点编号乘2加1;

  • 两个基本操作:

  1. down(int u);简而言之就是一颗树从u的位置开始往当前这棵树下面的,如果下面 有比u位置的小的话,就去交换
  • void down(int u) {
    // 这个模板的作用是父节点和其两个孩子节点的最小值,再交换父节点和这个最小值
    int t = u;
    if (u * 2 <= cnt && h[u * 2] < h[t])
    t = 2 * u;
    if (u * 2 + 1 <= cnt && h[u * 2 + 1] < h[t])
    t = 2 * u + 1;
    if (u != t) {
    swap(h[u], h[t]);
    down(t);
    //每次这个t都是最小的哈
    // 递归处理这个输入的值,直到它down到不能down为止,即整棵树又变成了一个小根堆.
    }
    }
  1. down(int u);简而言之就是一颗树从u的位置开始往当前这棵树下面的,如果下面 有比u位置的小的话,就去交换
  •  void up(int u) {
    while (u / 2 && h[u / 2] > h[u]) {
    swap(h[u], h[u / 2]);
    u /= 2;
    }
    }

  • 题目链接:https://www.acwing.com/problem/content/description/840/

  • #include "iostream"
    using namespace std;
    const int N = 100010;
    int h[N], cnt;
    void down(int u) {
    int t = u;
    if (u * 2 <= cnt && h[u * 2] < h[t])
    t = 2 * u;
    if (u * 2 + 1 <= cnt && h[u * 2 + 1] < h[t])
    t = 2 * u + 1
    if (u != t) {
    swap(h[u], h[t]);
    down(t);
    }
    }
    void up(int u) {
    while (u / 2 && h[u / 2] > h[u]) {
    swap(h[u], h[u / 2]);
    u /= 2;
    }
    }
    int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    cin >> h[i];
    cnt = n;
    /*
    cnt来存节点的最大下标,因为找左右孩子需要用2*u和2*u+1,
    为了防止边界值问题,需要判断2*u < n,2*u+1<n;
    并且,cnt也可以看成指向堆尾的一个指针。
    */
    for (int i = n / 2; i; i--)
    down(i);
    //初始化小根堆
    // 用down函数将整棵树调整为一个小根堆
    // 从2分之n开始down,建堆,时间复杂度为O(n)
    while (m--) {
    cout << h[1] << " ";
    h[1] = h[cnt--];
    down(1);
    }
    }

最新文章

  1. ECharts-图表回执组件
  2. Nodejs进阶:核心模块net入门与实例讲解
  3. 消除ComponentOne(C1StudioNet_2013v2) 的注册提示
  4. 手机网页制作的认识(有关meta标签)
  5. adb shell settings ....
  6. SpringMVC4+thymeleaf3的一个简单实例(篇二:springMVC与thymeleaf的整合)
  7. repeater 分页显示数据
  8. Eclipse Oxygen 解决 自动导包的问题
  9. linux下高可用LVS搭建及配置方法
  10. nth-child()选择器小结
  11. MySQL 大数据量快速插入方法和语句优化
  12. Codeforces1100F Ivan and Burgers 【整体二分】【线性基】
  13. hdu some problems in Multi-University Training Contest
  14. 非ECS阿里云安装插件,给阿里云云监控平台
  15. D. Recovering BST Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
  16. Linux 条件变量函数signal和wait补充
  17. 彻底关闭win10的自动更新,一定要坚持看到最后一页
  18. bzoj2095-Bridge
  19. jquery radio的操作
  20. 获取web项目中的webroot目录路径

热门文章

  1. 微信小程序级联选择器省市区选择器部分安卓手机兼容的问题:无法只选省份,必须选择到市
  2. pycharm中运行shell脚本
  3. db2存储过程很慢如何查看
  4. Spark之详解及性能优化
  5. vue3 生成二维码 qrcodejs2-fix
  6. 【otter搭建】在Linux下搭建阿里开源otter数据同步平台
  7. vue3中使用vite-ts构建项目时tsconfig.json的配置
  8. MongoDB和sql语句的对照
  9. Log4NET 日志分割删除与压缩解决思路(附源码)
  10. iOS 12.3 - iOS 13.X 爱思助手越狱教程