磊磊零基础打卡算法:day17 c++堆排序
5.20
前言吐槽:
- 今天是5.20啦,但是作为单身修狗的我只能和代码过啦。。。继续加油算法打卡!!!
堆排序:
堆就是一棵完全二叉树
二叉堆是一种支持插入,删除,查询最值的数据结构。他其实是一棵满足"堆性质"的完全二叉树,树上的每个节点带有一个权值。若树中的任意一个节点的权值都小于等于其父节点的权值,则称该二叉树满足"大根堆性质”。若树中任意一个节点的权值都大于等于其父节点的权值,则称该二叉树满足"小根堆性质”。
这里采用一个数组来保存二叉堆。逐层从左到右为树中的节点依次编号,把此编号作为节点在数组中存储的位置(下标)。在这种存储方式中,父节点编号等于子节点编号除以2,左子节点编号等于父节点编号乘2,右子节点编号等于左子节点编号乘2加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为止,即整棵树又变成了一个小根堆.
}
}
- 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++堆排序的更多相关文章
- 零基础学C#算法(零基础学算法——C#版)
今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...
- 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础
---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...
- Android零基础入门第71节:CardView简单实现卡片式布局
还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...
- 【零基础学习iOS开发】【转载】
原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇
从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...
- 【零基础学习iOS开发】【01-前言】01-开篇
本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...
- 零基础一年拿下BAT三家offer
背景 1.本人本科一本双非垫底的那种,硕士211.本硕电子通信,完全0基础,转行一年. 2.研一上第一学期上课+外派到老师合作公司写MATLAB.去年4月开始学习Java. 起步 1.实话说,刚决定转 ...
- 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉
机器视觉 machine vision机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完 ...
- 快快使用ModelArts,零基础小白也能玩转AI!
摘要: 走过路过不要错过,看Copy攻城狮如何借力华为云ModelArts玩转AI. "自2018年10月发布以来,ModelArts累计服务了众多行业十几万开发者,通过基础平台的完备性和面 ...
- 零基础的Java小白如何准备初级开发的面试
对于各位Java程序员来说,只要能有实践的机会,哪怕工资再低,公司情况再一般,只要自己上心努力,就可能在短时间内快速提升,甚至在工作2年后进大厂都有希望,因为项目里真实的开发实践环境是平时学习不能模拟 ...
随机推荐
- conda 备份与还原环境
文章目录 1.创建环境2.激活环境3.安装包(1)手动一个一个安装(2)批量安装4.卸载包(1)手动一个一个卸载(2)批量卸载5.查看当前环境中所有已安装的包6.退出当前环境方法1:激活base环境即 ...
- jubyter notebook 安装conda 虚拟环境
- go语言web框架-如何使用gin教程+react实现web项目
go-web+ react实践项目 前端使用react 搭建,从webpack搭建开始写,后端是学习go语言过程中的实践,由于之前没有实际的后端web经验,所以是自己一点一点摸索出来的.有错漏还望指正 ...
- kubeadm安装单master单node节点k8s集群
操作系统:centos7.6 podSubnet(pod 网段) 10.244.0.0/16 serviceSubnet(service 网段): 10.10.0.0/16 集群角色 IP 主机名 安 ...
- .Net Standard .Net Framework .Net Core 版本对应
- windows检查
# coding: UTF-8 import psutil import platform import re def get_cpu_used(upu_base, interval=1): perc ...
- Node Sass version 7.0.1 is incompatible with ^4.0.0 node-sass 问题
执行旧版项目安装依赖时报错 卸载 npm uninstall node-sass sass-loader 安装(need Python27) npm install sass-loader@7.3.1 ...
- elementUi - 页面设计规范
elementUi - 页面设计规范 参考资料 element 字体 Font-family 代码 font-family: "Helvetica Neue",Helvetica, ...
- Docker 安装流程-CentOS
0.安装Docker Docker 分为 CE 和 EE 两大版本.CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月. Docker CE 分为 s ...
- 学习sql
里面说了很多sql的应用,可以借鉴以下网址:https://www.w3school.com.cn/sql/index.asp