【数据结构•堆】堆排序(理论基础)

堆的定义
 • 堆是一个完全二叉树
  –所有叶子在同一层或者两个连续层
  –最后一层的结点占据尽量左的位置
 • 堆性质
  –为空, 或者最小元素在根上
  –两棵子树也是堆

存储方式
 • 最小堆的元素保存在heap[1..hs]内
  – 根在heap[1]
  –K的左儿子是2k, K的右儿子是2k+1,
  –K的父亲是[k/2]

1557927243672469506.bmp

删除最小值元素
 • 三步法
  – 直接删除根
  – 用最后一个元素代替根上元素
  – 向下调整

1557927310072496130.bmp

 • 首先选取当前结点p的较小儿子,如果比p大, 调整停止;否则交换p和儿子, 继续调整

1557927360928432129.bmp

插入元素和向上调整
 • 插入元素是先添加到末尾, 再向上调整
 • 向上调整: 比较当前结点p和父亲, 如果父亲比p小,停止; 否则交换父亲和p, 继续调整

堆的建立(堆的构造)
  1、自底向上堆构造算法:
  在初始化一棵包含几个节点的完全二叉树时,按给定的顺序来效置键;然后按照下面的方法对树进行“堆化”(如下图)从最后的父母节点开始,到根为止,该算法检查这些节点的键是否满足父母优势要求。如果该节点不满足,该算法把节点的键k和它子女的最大键进行交换,然后再检查在新位置上,k是不是满足父母优势要求。这个过程一直继续到对k的父母优势要求满足为止,对于以当前父母节点为根的子树,在完成了它“堆化”以后,该算法对于该节点的直接前趋进行同样的操作。在对树的根完成了这种操作以后,该算法就停止了。    
 

1557927465840558082.bmp

  2、自顶向下堆构造算法:
  通过把新的键连续插入预先构造好的堆,来构造一个新堆,如何把一个新的键k插入到堆中呢?首先,把一个包含键k的新节点附加在当前堆的最后一个叶子后面,然后按照下面的方法把k筛选到它的适当位置,拿k和它父母的键作比较,如果后者大于等于k,算法停止;否则,交换这两个键并把k和它的新父母做比较。这种交换一直持续到k不大于它的最后一个父母,或者是达到了树的根为止(如下图)。在这个算法中,我们也可以把一个空节点向上筛选,直到达到合适的位置,才把k的值赋予它。

1557927540822130689.bmp

  显然,这个插入操作所需的键值比较次数不可能超过堆的高度。因为包含几个节点的堆的高度大约是log2n所以插入的时间效率属于o(logn)。

删除堆中某个元素(不一定是堆顶元素)
  1、以堆中最后一个元素取代被删除元素留下的空位(此举确保堆首先是一个完全二叉树)。
  2、堆调整(堆化)。

时间复杂度分析
 • 向上调整/向下调整
  – 每层是常数级别, 共logn层, 因此为:O(logn)
 • 插入/删除
  – 只调用一次向上或向下调整, 因此都是:O(logn)
 • 建堆
  – 高度为h的结点有n/2h+1个,总时间为:O(n*logn)

【堆,这种数据结构适合解决何种类型的问题?】
  ???........
  D$#@&(<):>M"|{_#!@SAQ$&GBD^KFG(*&$#$BK}{?<:>"X~@^


===========================================


【堆排序实践】

  输入n个整数( n <= 10^5),按从大到小排序后输出。
  操作步骤:
   1) 建立堆。(直接在待排序数据A[]上建立最大堆)
   2) 重复调整堆。取出堆首元素(根元素),交换至堆尾部,堆容量减1,继续调整。

优秀范例代码展示(构架清晰、代码简洁、高效!)

输入输出格式

输入格式:

  二行,第一行,一个整数值n( n <= 10^5 );第二行,n个整数,每个整数均小于2^31,每个整数间有一个空格间隔。

输出格式:

  一行,排好序(从大到小的顺序!!)的n个数据,每个数据间用一个空格间隔。

输入输出样例

输入样例#1:

4
4 5 2 897

输出样例#1:

897 5 4 2

提示信息

如果仅仅为了AC,那么排序吧!

sort也有一定概率堆排

#include<bits/stdc++.h>
#define sp sort
using namespace std;
int n,a[100010];
int cmp(int x,int y)
{return x>y;
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}sp(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){cout<<a[i]<<" ";}return 0;
}

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

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

相关文章

细胞——求细胞数量 C++详解

细胞——求细胞数量 C详解 求细胞数量题目描述输入格式输出格式样例样例输入样例输出 提示数据规模与约定 解法代码 求细胞数量 题目描述 一矩形阵列由数字 0 0 0 到 9 9 9 组成&#xff0c;数字 1 1 1 到 9 9 9 代表细胞&#xff0c;细胞的定义为沿细胞数字上下左右若还…

vue3中使用component动态组件常见问题

一. 在vue3中使用动态组件问题警告处理 1. 代码如下 <template><div v-for"(item, index) in navItems" :key"index"><component :is"item.component" :key"item.gameId"></component></div> </te…

nbcio-boot升级springboot、mybatis-plus和JSQLParser后的LocalDateTime日期json问题

升级后&#xff0c;运行显示项目的时候出现下面错误 2023-08-12 10:57:39.174 [http-nio-8080-exec-3] [1;31mERROR[0;39m [36morg.jeecg.common.aspect.DictAspect:104[0;39m - json解析失败Java 8 date/time type java.time.LocalDateTime not supported by default: add Mo…

Leetcode-每日一题【剑指 Offer 26. 树的子结构】

题目 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3 / \ 4 5 / \ 1 2 给定的树 B&#xff1a; 4 / 1 返回 true&#xff0…

ffmpeg ts列表合并为mp4

操作系统&#xff1a;ubuntu 注意事项&#xff1a; 1.ts文件顺序必须正确&#xff0c;也就是下一帧的dst和pst要比上一帧的大&#xff0c;否则会报错 2.codecpar->codec_tag要设置为0&#xff0c;否则报错Tag [27][0][0][0] incompatible with output codec id ‘27’ (avc1…

docker版jxTMS使用指南:使用jxTMS采集数据之二

本文是如何用jxTMS进行数据采集的第二部分&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内…

Vue + MapBox快速搭建

一、说明&#xff1a; 1.mapbox-gl自2.0版本开始不再开源&#xff0c;需要用户在官网申请key使用。 2.maplibre GL JS是一个开源库&#xff0c;它起源于 mapbox-gl-js 的开源分支。该库的初始版本&#xff08;1.x&#xff09;旨在替代Mapbox的OSS版本。简单来说maplibre是mapb…

异步场景加载详解

异步场景加载详解 介绍 异步场景加载是一种在Unity中加载场景的方式&#xff0c;它允许在加载过程中执行其他操作&#xff0c;并提供了加载进度的反馈。通过异步加载&#xff0c;可以避免加载大型场景时的卡顿现象&#xff0c;提高游戏的流畅性和用户体验。 方法 在Unity中…

C++——缺省参数

缺省参数的定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数的时候&#xff0c;如果没有指定实参&#xff0c;则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout << a << endl; } int main() { Func()…

【Kubernetes】Kubernetes之Pod详解

Pod 一、 Pod1. Pod 基础概念2. 在 Kubrenetes 集群中 Pod 使用方式2.1 pasue 容器2.2 kubernetes 中的 pause 容器提供的功能 3. Pod 的概念和结构组成4. Pod 的分类5. Pod 容器的分类5.1 基础容器&#xff08;infrastructure container&#xff09;5.2 初始化容器&#xff08…

07 |「异步任务」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、进程与线程1、进程2、线程 二、实现三、异步任务加载器 一、进程与线程 1、进程 进程(Process)是操作系统分配资源的基本单位,它是一个执行中的程序实例&#xff1b;每个进程都有自己独立的内存空间,不同…

【大数据】Flink 详解(二):核心篇 Ⅲ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制&#xff1f; Flink 使用 轻量级分布式快照&#xff0c;设计检查点&#xff08;checkpoint&#xff09;实现可靠容错。 30、什么是 Checkpoin 检查点&#xff1f; Checkpoint …

百度 amis 当成 UI 库用

百度 amis 当成 UI 库用 1.获取到这些 amis 对外提供的方法 var amisLib amisRequire(amis);// 获取到这些 amis 对外提供的方法。 2.js中使用百度amis中 confirm var name"name";amisLib.confirm(请确认删除 name !,"删除").then((confirmed) > {if…

如何进行游戏平台搭建?

游戏平台搭建涉及多个步骤和技术&#xff0c;下面是一个大致的指南&#xff1a; 市场调研和定位&#xff1a;首先&#xff0c;要了解游戏市场和受众的需求&#xff0c;选择适合的游戏类型和定位。 选择平台类型&#xff1a;决定是要搭建网页平台、移动应用平台还是其他类型的…

群晖6.X便捷的安装cpolar内网穿透

群晖6.X便捷的安装cpolar内网穿透 文章目录 群晖6.X便捷的安装cpolar内网穿透前言1. 下载cpolar的群晖套件1.1 打开群晖套件中心1.2 选择“手动安装”1.3 选择下载cpolar套件位置 2. 打开cpolar的Web-UI界面3. 注册会员 前言 随着硬件设备和软件技术的发展&#xff0c;以及数据…

概率图模型(Probabilistic Graphical Model,PGM)

概率图模型&#xff08;Probabilistic Graphical Model&#xff0c;PGM&#xff09;&#xff0c;是一种用图结构来描述多元随机变量之间条件独立性的概率模型。它可以用来表示复杂的概率分布&#xff0c;进行有效的推理和学习&#xff0c;以及解决各种实际问题&#xff0c;如图…

Redis小例子

MAC电脑下Redis的安装&#xff1a; brew install redis下面给一个Java操作redis的小例子 import redis.clients.jedis.Jedis;public class Demo {public static void main(String[] args) {// 创建 Jedis 客户端实例&#xff0c;连接到本地 Redis 服务器&#xff0c;默认端口…

RedisDesktopManage

RDM 简介下载安装 简介 RedisDesktopManager&#xff08;RDM&#xff09;是一个开源的跨平台图形界面工具&#xff0c;用于管理和操作 Redis 数据库。它提供了一个用户友好的界面&#xff0c;使用户能够轻松地连接、浏览、查询和修改 Redis 数据&#xff0c;而无需使用命令行界…

教你10分钟内学习如何CSS 设置网页打印时的样式

本文将教您开始为要打印的页面编写CSS所需要的一切提供帮助。 media 规则 If you’ve done any responsive design, you’ll already know about the media rule. As well as different screen sizes, media also lets you target “print” media. Here’s an example: 如果…

竞赛项目 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…