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);
    }
    }

磊磊零基础打卡算法:day17 c++堆排序的更多相关文章

  1. 零基础学C#算法(零基础学算法——C#版)

    今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...

  2. 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础

    ---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...

  3. Android零基础入门第71节:CardView简单实现卡片式布局

    还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...

  4. 【零基础学习iOS开发】【转载】

    原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...

  5. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  6. 【零基础学习iOS开发】【01-前言】01-开篇

    本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...

  7. 零基础一年拿下BAT三家offer

    背景 1.本人本科一本双非垫底的那种,硕士211.本硕电子通信,完全0基础,转行一年. 2.研一上第一学期上课+外派到老师合作公司写MATLAB.去年4月开始学习Java. 起步 1.实话说,刚决定转 ...

  8. 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

    机器视觉 machine vision机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完 ...

  9. 快快使用ModelArts,零基础小白也能玩转AI!

    摘要: 走过路过不要错过,看Copy攻城狮如何借力华为云ModelArts玩转AI. "自2018年10月发布以来,ModelArts累计服务了众多行业十几万开发者,通过基础平台的完备性和面 ...

  10. 零基础的Java小白如何准备初级开发的面试

    对于各位Java程序员来说,只要能有实践的机会,哪怕工资再低,公司情况再一般,只要自己上心努力,就可能在短时间内快速提升,甚至在工作2年后进大厂都有希望,因为项目里真实的开发实践环境是平时学习不能模拟 ...

随机推荐

  1. tomcat代理,监控及性能优化

    第1章 tomcat简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同 ...

  2. Java注解及应用原理

    视频地址:https://www.bilibili.com/video/BV1Py4y1Y77P/?spm_id_from=333.337.search-card.all.click&vd_s ...

  3. 普通java项目打成jar包,引入第三方jar .

    ja方法1 .  MANIFEST.MF 中添加  Class-Path . 1.  项目src目录下创建  META-INF/MANIFEST.MF 文件.文件内容 Manifest-Version ...

  4. linux内核源码编译加制作rpm包

    本章主要讲解实际操作步骤,具体理论知识可以自行百度 linux内核官网下载:https://cdn.kernel.org/pub/linux/kernel/   (如图) 根据官网发布的信息分析,目前 ...

  5. 使用 DataType 特性应用于 Date 和 Price 属性

    [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { g ...

  6. C# 使用多线程的几种方式

    1.Thread 详细介绍:https://www.cnblogs.com/cheng8/p/16147918.html 使用Thread类通过ThreadStart(无参数)或Parameteriz ...

  7. Docker-Compose实战<下篇>

    本文是在上一篇文章的基础上做的一些内容追加,上文最后截止内容是docker-compose build将镜像生成完成.接下来我将继续写启动相关服务,访问服务以及常用命令使用等. 1 启动镜像 使用命令 ...

  8. SEO高质量外链怎么做?

    其实seo是一个很枯燥的东西,说技术也没有什么技术可言 1.你需要每天坚持更新你的网站,坚持写软文 2.你需要每天发外链,而且有质量的外链 3.你需要每天交换友情链接来增加网站的权重名 4.你需要每天 ...

  9. MacOS如何使用语音输入

    Siri是Apple旗下强大的语音助手,而Siri的语音输入是必不可少的的存在.目前的MacOS中都有语音听写功能,可以让它把我们的语音转化成为文字.如果你此时不想打字,或是不方便打字的情况下,这个功 ...

  10. alertmanger告警配置

    钉钉告警: 需先安装 Ding talk 配置 webhook vim docker-compose.yaml webhook-dingtalk: image: timonwong/prometheu ...