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

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

存储方式
 • 最小堆的元素保存在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.rhkb.cn/news/89135.html

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

相关文章

在线吉他调音

先看效果&#xff08;图片没有声&#xff0c;可以下载源码看看&#xff0c;比这更好~&#xff09;&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

【Unity】VS Code 没有智能提示 Unity 中的类

正常来说&#xff0c;VS Code中会对部分输入类名进行提示&#xff0c;如下图所述 假如你从Unity 中进入 VS Code后发现没有提示相关 Unity的类&#xff0c;可能是 Unity 中 有关于 VS Code的相关Package 没有跟着 VS Code升级到最新版本。 点击Unity Windows 下拉框中的 Pac…

基于Promise.resolve实现Koa请求队列中间件

本文作者为360奇舞团前端工程师 前言 最近在做一个 AIGC 项目&#xff0c;后端基于 Koa2 实现。其中有一个需求就是调用兄弟业务线服务端 AIGC 能力生成图片。但由于目前兄弟业务线的 AIGC 项目也是处于测试阶段&#xff0c;能够提供的服务器资源有限&#xff0c;当并发请求资源…

直播带货热潮:海外网红直播对产品推广的影响与机遇

随着互联网的快速发展和社交媒体的普及&#xff0c;直播带货成为了一种风靡全球的新型营销方式。其中&#xff0c;海外网红直播作为直播带货的一种形式&#xff0c;引起了广泛的关注。海外网红以其独特的个人魅力和粉丝基础&#xff0c;成为了产品推广的强有力渠道。本文Nox聚星…

SpringBoot 异步、邮件任务

异步任务 创建一个Hello项目 创建一个类AsyncService 异步处理还是非常常用的&#xff0c;比如我们在网站上发送邮件&#xff0c;后台会去发送邮件&#xff0c;此时前台会造成响应不动&#xff0c;直到邮件发送完毕&#xff0c;响应才会成功&#xff0c;所以我们一般会采用多线…

JVM 调优实例

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM提供了多种垃圾回收器&#xff0c;可以根据应用程序的需求选择最适合的垃圾回收器。例如&#xff0c;如果应用程序需要更快的响应时间&#xff0c;可以选择并行垃圾回收…

从源代码编译构建Apach Spark3.2.4

从源代码编译构建Apach Spark3.2.4 编译说明编译Apache Spark下载源码构建环境准备使用本地Maven构建更改Scala版本下载Jar包构建可运行的发行版构建异常构建成功 运行测试 编译说明 对于大多数用户来说&#xff0c;使用官方预编译版本的Spark已经足够满足日常需求。只有在特定…

FFmpeg常见命令行(四):FFmpeg流媒体

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

10.Eclipse配置Tomcat详细教程、如何使用Eclipse+tomcat创建并运行web项目

一、Tomcat的下载官网 -> 进入官网显示如图所示的界面&#xff0c;在下下载的是Tomcat9.0版本&#xff0c;你可以自己选一款 点击然后进入下面这个界面 最好是在你的D盘建立一个文件夹&#xff0c;把它解压在里面&#xff0c;文件夹名自己来吧&#xff0c;自己能知道里面装…

使用基于jvm-sandbox的对三层嵌套类型的改造

使用基于jvm-sandbox的对三层嵌套类型的改造 问题背景 先简单介绍下基于jvm-sandbox的imock工具&#xff0c;是Java方法级别的mock&#xff0c;操作就是监听指定方法&#xff0c;返回指定的mock内容。 jvm-sandbox 利用字节码操作和自定义类加载器的技术&#xff0c;将原始方法…

【jvm】类加载子系统

目录 一、图二、类加载器作用三、类加载器角色四、类的加载过程4.1 加载4.1.1 说明4.1.2 加载.class文件的方式 4.2 链接4.2.1 验证(verify [ˈverɪfaɪ])4.2.2 准备(prepare)4.2.3 解析(resolve) 4.3 初始化4.3.1 说明4.3.2 图示14.3.3 图示24.3.3 图示3 一、图 二、类加载器…

解密Flink的状态管理:探索流处理框架的数据保留之道,释放流处理的无限潜能!

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 一、什么是状态二、应用场景三、Flink中状态的分类四、算子状态1. 列表状态&#xff08;List State&#xff09;2. 广播状态&#xff08;Broadcast State&#xff09; 五、键控状态1. Val…

股票指数——RSI指数

RSI指数的计算非常简单&#xff0c;就是使用一段时间内的平均上涨除以平均上涨加平均下跌&#xff08;取正值&#xff09;。也就意味着RSI指数的取值是[0,100]之间&#xff0c;其中0表示周期内没有上涨的&#xff0c;100表示周期内没有下跌的。RSI的直观意义是它表示了一段周期…

用神经网络玩转数据聚类:自编码器的原理与实践

目录 引言一、什么是自编码器二、自编码器的应用场景三、自编码器的优缺点四、如何实现基于自编码器的聚类算法五、总结 引言 随着数据量的爆炸性增长&#xff0c;如何有效地处理和分析数据成为了一个重要的问题。数据聚类是一种常用的数据分析方法&#xff0c;它可以将数据集…

gateway做token校验

本文使用springcloud的gateway做token校验 登录的本质&#xff1a;拿用户名和密码 换 token。 token会返回给浏览器&#xff08;存储&#xff09;&#xff0c;当访问的时候&#xff0c;携带token 发起请求。 token校验图 引入redis依赖 <dependency><groupId>or…

codeforces代:

感受思维的美丽&#xff0c;abcde题目的思路是怎么样的&#xff1a; 上蓝 上紫 可以代 &#xff1a;有问题可以评论区 直接问我 也可以q: 639682754

Django入门

Day1 django环境安装 创建虚拟环境 # step1 创建虚拟环境 python3 -m venv datawhale_django # step2 mac进入虚拟环境 source ./datawhale_django/bin/activate # step3 退出虚拟环境 deactivate安装包 pip3 install django ​pip3 install djangorestframework​​ pip3 …

关于selenium 元素定位的浅度解析

一、By类单一属性定位 元素名称 描述 Webdriver API id id属性 driver.find_element(By.ID, "id属性值") name name属性 driver.find_element(By.NAME, "name属性值") class_name class属性 driver.find_element(By.CLASS_NAME, "class_na…

【Vue-Router】路由入门

路由&#xff08;Routing&#xff09;是指确定网站或应用程序中特定页面的方式。在Web开发中&#xff0c;路由用于根据URL的不同部分来确定应用程序中应该显示哪个内容。 构建前端项目 npm init vuelatest //或者 npm init vitelatest安装依赖和路由 npm install npm instal…

VSCode如何设置高亮

一、概述 本文主要介绍在 VSCode 看代码时&#xff0c;怎样使某个单词高亮显示&#xff0c;主要通过以下三步实现&#xff1a; 安装 highlight-words 插件 配置 highlight-words 插件 设置高亮快捷键F8 工作是嵌入式开发的&#xff0c;代码主要是C/C的&#xff0c;之前一直用…