堆专题4 堆排序

news2024/11/28 12:53:16

题目:

样例:

输入
5
2 8 5 1 3
输出
1 2 3 5 8

思路:

        由题意,堆的排序,就是结合向下或向上调整的方式,调整堆顺序,全部的各个部分都变为 顶堆形式。不同的是,由于我们是顶堆原理,我们取的是顶部,所以使用向下调整方式更为方便些,

此时我们将最小的堆顶放置在堆数组末尾,

即我们要倒着枚举 从 n 开始 for(int i = n;i;--i) 将 堆顶数值  放置在堆的后面swap(1,i)然后 调整我们没取得的 downAdjust(1,i - 1)。

最后根据 根部向下的调整,我们会获得一个递减或者递增的序列,

如果是小顶堆,根据向下调整,堆的排序,我们会获得一个递减序列,因为 downAdjust(1,i - 1) 使得 左右孩子的大小比较的调整,得出层序数组的 heap 是个递减序列。

如果是大顶堆,堆排序后是 递增序列。

代码详解如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define x first
#define y second
#define mk make_pair
#define int long long
#define NO puts("NO")
#define YES puts("YES")
#define umap unordered_map
#define INF 0x3f3f3f3f3f3f3f3f
#define All(x) (x).begin(),(x).end()
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)

using namespace std;
const int N = 2e6 + 10;
using PII = pair<int,int>;

int n;
umap<int,int>heap;

// 向下调整 大顶堆
inline void downAdjust(int low,int high)
{
	int i = low,j = i << 1;
	while(j <= high)
	{
		if(j + 1 <= high && heap[j + 1] > heap[j]) ++j;
		if(heap[j] > heap[i])
		{
			swap(heap[j] , heap[i]);
			i = j;
			j = i << 1;
		}else return ;
	}
}

inline void sortHeap()
{
	// 调整创建 大顶堆
	for(int i = n >> 1;i;--i) downAdjust(i,n);
	
	// 创建小顶堆后,我们每次根据大顶堆的顶部最大原理
	// 调整到 堆后面,最后 向下调整 获得递增序列
	for(int i = n;i;--i)
	{
		swap(heap[1],heap[i]);	// 顶堆元素放在 堆后面,交换 顶堆 和 尾堆
		downAdjust(1,i - 1);	// 向下调整我们 没取到的 堆, 尾堆是我们取到的,所以不能调整 ,所以是 i - 1
	}
}

inline void solve()
{
	cin >> n;
	// 插入对数组中
	for(int i = 1;i <= n;++i) cin >> heap[i];
	
	sortHeap();
	
	for(int i = 1;i <= n;++i)
	{
		if(i > 1) cout << ' ';
		cout << heap[i];
	}
}
signed main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1096473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学信息系统项目管理师第4版系列28_组织级项目管理和量化项目管理

1. OPM 1.1. 旨在确保组织开展正确项目并合适地分配关键资源 1.1.1. 有助于确保组织的各个层级都了解组织的战略愿景、实现愿景的措施、组织目标以及可交付成果 1.2. 业务评估是建立OPM框架的必要组件 1.3. OPM3 是组织级项目管理成熟度模型&#xff0c;可用于评估组织项目…

华为OD机考算法题:开心消消乐

题目部分 题目开心消消乐难度易题目说明给定一个 N 行 M 列的二维矩阵&#xff0c;矩阵中每个位置的数字取值为 0 或 1&#xff0c;矩阵示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0&#xff0c;规则如下&#xff1a; 1) 当点击一…

互联网Java工程师面试题·Java 总结篇·第一弹

目录 1、面向对象的特征有哪些方面&#xff1f; 2、访问修饰符 public,private,protected,以及不写&#xff08;默认&#xff09;时的区别&#xff1f; 3、String 是最基本的数据类型吗&#xff1f; 4、float f3.4;是否正确&#xff1f; 5、short s1 1; s1 s1 1;有错吗…

Deno 下一代JavaScript运行时

目录 1、简介 2、Deno 的特点 3、Deno 和 Node 的区别 4、TypeScript开箱即用 5、内置的基本开发工具 独立可执行文件 测试运行器 代码格式化程序 代码linter 6、专为云而建 7、从浏览器到后端的一致代码 TC39 WinterCG 8、高性能联网 9、数百万个社区模块 10、相关框架 1、简介…

Stream流中的 distinct()方法

去除流中重要的元素。依赖&#xff08;hashCode和equals方法&#xff09; Stream流中无法直接修改集合、数组中的数据 package com.csdn.streampractice; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class StreamTest {public …

初级篇—第八章精讲MySQL数据类型

文章目录 MySQL数据类型常见的属性字符集设置数据库的字符设置表的字符集设置字段的字符集设置 整型数据类型可选属性MUNSIGNEDZEROFILL 如何选择&#xff1f; 浮点类型FLOAT 和 DOUBLE 这两种数据类型的区别是啥呢&#xff1f;为什么浮点数类型的无符号数取值范围&#xff0c;…

使用js获取选中的dom元素 并改变选中(有序dom)的状态

一个效果图&#xff0c;一段代码&#xff0c; 就这样吧。 <template><!-- <el-checkbox v-model"">开启双向</el-checkbox> --><divref"checkListRef"mouseup"mouseupCon"mousedown"mousedownCon"mouseov…

【MySQL】深入了解索引的底层逻辑结构

文章目录 主键排序一. InnoDB的索引结构1. 单个page2. 多个page 二. 为什么选择B树三. 聚簇索引和非聚簇索引结束语 主键排序 我们创建一个user表&#xff0c;并乱序插入数据 mysql> create table if not exists user(-> id int primary key,-> age int not null,-&…

【AI视野·今日NLP 自然语言处理论文速览 第五十四期】Fri, 13 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 13 Oct 2023 Totally 75 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Tree-Planner: Efficient Close-loop Task Planning with Large Language Models Authors Mengkang Hu, Yao M…

比特听命:补码的产生过程与整数在计算机中的存储

文章目录 参考环境声明八位二进制加法器八进制数值 原码概念正负数与零正数与负数的运算 反码概念一步之遥 补码概念唯一的零加法运算 补码的优缺点优点简化算术运算一眼辨别正负性运算过程中无需对符号位进行处理 缺点不易阅读 参考 项目描述搜索引擎Bing、GoogleAI 大模型文…

c#设计模式-行为型模式 之 访问者模式

&#x1f680;简介 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 访问者模式包含以下主要角色 : 抽象访问者&#xff08;Visitor&#xff09;角色&#xff1a;定义了对每一个元素 &#xff08;E…

英语——语法——从句——句型和句子成分——笔记

老师导言&#xff1a;易于理解。 三种句型&#xff1a;1、主系表&#xff1b;2.主谓*&#xff1b;3.there be 句型&#xff1a;句子构成的形式。句子用于相互沟通&#xff0c;需要表达自己意思&#xff0c;句子中就存在一个主语&#xff0c;一般对主语&#xff08;主要描述对象…

4.Mask R-CNN/YOLOV8/RTMDET三种实例分割方法推理逻辑对比

文章目录 Mask R-CNN/YOLOV8/RTMDET三种实例分割方法推理逻辑对比Mask R-CNNYOLOV5/8实例分割方法RTMDet中的实例分割 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Mask R-CNN/YOLOV8/RTMDET三种实例分割方法推理逻辑对比 实例分割是同…

CLIP模型原理与代码实现详解

文章目录 前言一、CLIP模型原理1.背景介绍2.对比训练方式3.prompt推理方式4.图像与文本编码结构5.特征CLS token结构vit划分patch原理cls token原理 二、CLIP环境安装1.官方环境安装2.CLIP环境安装3.CLIP运行结果 三.CLIP的Transformer结构代码解读四、CLIP模型主函数代码解读五…

相似性搜索:第 4 部分--分层可导航小世界 (HNSW)

SImilarity 搜索是一个问题&#xff0c;给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。 一、介绍 在数据科学中&#xff0c;相似性搜索经常出现在NLP领域&#xff0c;搜索引擎或推荐系统中&#xff0c;其中需要检索最相关的文档或项目以进行查询。在大量数据中…

从0开始学go第八天

gin获取URL路径参数 package main//获取path&#xff08;URL&#xff09;参数 import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/:name/:age", func(c *gin.Context) {//获取路径参数name : c.Param(&quo…

15 | JPA 对 Web MVC 开发者做了哪些支持

我们使用 Spring Data JPA 的时候&#xff0c;一般都会用到 Spring MVC&#xff0c;Spring Data 对 Spring MVC 做了很好的支持&#xff0c;体现在以下几个方面&#xff1a; 支持在 Controller 层直接返回实体&#xff0c;而不使用其显式的调用方法&#xff1b;对 MVC 层支持标…

如何通过Photoshop将视频转换成GIF图片

一、应用场景 1、将视频转有趣动图发朋友圈 2、写CSDN无法上传视频&#xff0c;而可以用GID动图替代 3、其他 二、实现步骤 1、打开Photoshop APP 2、点击文件——导入——视频帧到图层 3、选择视频文件 4、配置视频信息&#xff0c;按照图片提示配置完毕之后&#xff0c;…

gma 2.0.2 (2023.10.15) 更新日志

安装 gma 2.0.2 pip install gma2.0.2新增 0.1、矢量提取&#xff08;重要更新&#xff09; &#xff08;见简单示例&#xff09;   现在&#xff0c;你可以像 numpy 或 pandas 一样直接对 Layer 进行切片提取。 0.2、修改属性表&#xff08;重要更新&#xff09; &#xff…

数电第一次实验

四选一&#xff0c;信号选择器 三位4选1多路选择器 要求输入信号有4个&#xff0c;且每个信号宽3位 如果是直接根据选择信号选 选择的是信号&#xff0c;选择的是编号&#xff0c;与信号具体是什么内容无关&#xff0c;信号的内容与其是否被选择无关&#xff0c;信号的编号…