当前位置: 首页 > news >正文

八大排序算法----堆排序

堆排序的基本步骤:(以从大到小的顺序排序为例)

1.构建大顶堆(每个结点的值都大于或等于其左右孩子结点的值

2.排序:每次堆顶的元素取出来(整个堆中值最大),与最后一个节点做交换,使末尾元素最大

3.交换完之后,需要重新维护堆中剩下的其他节点,保证每次的堆顶都是最大值,重复2,3,直到序列完全有序

Code:

//维护堆的性质
//大顶堆:父节点的左右孩子都比父节点小
//小顶堆:父节点的左右孩子都比父节点大
void heapify(vector<int>& nums, int n, int i)
{int large = i;//保存父节点int left = 2 * i + 1;//左孩子int right = 2 * i + 2;//右孩子//判断左孩子是否比父节点大? 大的话,就更新父节点的下标if (left<n && nums[left]>nums[large])large = left;//判断右孩子是否比父节点大? 大的话,就更新父节点的下标if (right<n && nums[right]>nums[large])large = right;//到此,已经找到了当前父节点和其左右孩子中最大的节点的下标//判断父节点的下标是否发生变化,如果不相等,说明左右孩子中有比父节点大的if (large != i){//交换节点,维护大顶堆swap(nums[large], nums[i]);//继续维护剩下的节点heapify(nums, n, large);}
}
void heapsort(vector<int>& nums, int n)
{//建堆:从最后一个有孩子的父节点开始建立//这里为什么是i = n / 2 - 1? 因为左孩子的下标可以表示为2*i+1,此时最后一个孩子的下标为n-1//推导过来,找到最后一个有孩子的父节点的下标为n / 2 - 1for (int i = n / 2 - 1; i >= 0; i--){heapify(nums, n, i);}//排序:将大顶堆的顶与最后一个叶子节点进行交换,也就是每次找到当前堆中最大的元素,放在数组的最后面for (int i = n - 1; i > 0; i--){//交换swap(nums[i], nums[0]);//继续维护大顶堆中剩下节点,要始终保持是大顶堆的顺序heapify(nums, i, 0);}
}
int main()
{int n;cin >> n;vector<int> nums(n);for (int i = 0; i < n; i++){cin >> nums[i];}heapsort(nums, n);cout << "按升序顺序排序" << endl;for (auto& i : nums){cout << i << " ";}return 0;
}

这里如果要按照从小到大的顺序进行堆排序的话,只需要将维护堆的函数中if判断条件做一点小改动即可。

void heapify(vector<int>& nums, int n, int i)
{int small = i;//保存父节点int left = 2 * i + 1;//左孩子int right = 2 * i + 2;//右孩子if (left<n && nums[left]<nums[small])small = left;if (right<n && nums[right]>nums[small])small = right;//判断父节点的下标是否发生变化,if (small != i){//交换节点,维护大顶堆swap(nums[small], nums[i]);//继续维护剩下的节点heapify(nums, n, small);}
}

堆排序是不稳定的排序算法。

堆排序的时间复杂度:O(nlogn) 

相关文章:

八大排序算法----堆排序

堆排序的基本步骤&#xff1a;&#xff08;以从大到小的顺序排序为例&#xff09; 1.构建大顶堆&#xff08;每个结点的值都大于或等于其左右孩子结点的值&#xff09; 2.排序&#xff1a;每次堆顶的元素取出来&#xff08;整个堆中值最大&#xff09;&#xff0c;与最后一个…...

Docker Desktop 设置镜像环境变量

点击run 展开Optional settings container name &#xff1a;容器名称 Ports&#xff1a;根据你需要的端口进行输入&#xff0c;不输入则默认 后面这个 比如我这个 5432 Volumes&#xff1a;卷&#xff0c;也就是做持久化 需要docker 数据保存的地方 Environment variables…...

springboot之一:配置文件(内外部配置优先顺序+properties、xml、yaml基础语法+profile动态切换配置、激活方式)

配置的概念&#xff1a; Spring Boot是基于约定的&#xff0c;所以很多配置都有默认值&#xff0c;但如果想使用自己的配置替换默认配置的话&#xff0c;就可以使用application.properties或者application.yml(application.yaml)进行配置。 注意配置文件的命名必须是applicat…...

涛然自得周刊(第 5 期):蝲蛄吟唱的地方

作者&#xff1a;何一涛 日期&#xff1a;2023 年 8 月 20 日 涛然自得周刊主要精选作者阅读过的书影音内容&#xff0c;不定期发。历史周刊内容可以看这里。 电影 《沼泽深处的女孩》 改编自小说《蝲蛄吟唱的地方》&#xff0c;主角是一位在沼泽地独自生活并长大的女孩&…...

Android Ble蓝牙App(七)扫描过滤

Ble蓝牙App&#xff08;七&#xff09;扫描过滤 前言目录正文一、增加菜单二、使用MMKV① 添加依赖② 封装MMKV③ 使用MMKV 三、过滤空设备名四、过滤Mac地址五、过滤RSSI六、源码 前言 在上一篇文章中了解了MTU的相关知识以及对于设备操作信息的展示&#xff0c;本篇文章中将增…...

小程序当前页面栈以及跳转

1.调用页面栈刷新接口 let pages getCurrentPages(); //当前页面栈 if (pages.length > 1) { let beforePage pages[pages.length - 2]; //获取上一个页面实例对象 beforePage.$vm.getActivityLi…...

jQuery获取表单的值val()

&#xff08;1&#xff09;页面中有很多元素&#xff0c;包括表单中的输入项&#xff0c;如输入文本框等&#xff1b;获取、设置、输入文本框的值&#xff1b;val()方法。 &#xff08;2&#xff09;也包括<p>、<span>等元素&#xff1b;获取、设置这些元素的文本…...

【专栏必读】数字图像处理(MATLAB+Python)专栏目录导航及学习说明

文章目录 第一章&#xff1a;绪论第二章&#xff1a;数字图像处理基础第三章&#xff1a;图像基本运算第四章&#xff1a;图像的正交变换第五章&#xff1a;图像增强第六章&#xff1a;图像平滑第七章&#xff1a;图像锐化第八章&#xff1a;图像复原第九章&#xff1a;图像形态…...

2023年非证券类投资银行业发展报告

第一章 行业概况 非证券投资银行业是一个专门为公司、政府和高净值个人提供金融服务的行业&#xff0c;与传统的证券投资银行不同&#xff0c;其主要业务不涉及证券交易&#xff0c;而是注重为客户提供咨询服务、融资和投资管理等服务。 非证券投资银行通常涉及的业务领域包括…...

Matlab 如何把频谱图的纵坐标设置为分贝刻度

Matlab 如何把频谱图的纵坐标设置为分贝刻度 Matlab代码如下&#xff1a; % 如何把频谱图的纵坐标设置为分贝刻度 % % pr2_2_6 clc; clear; close all;load pr2_2_6_sndata1.mat % 读入数据 X fft(y); % FFT n2 1:L/21; % 计算正频率…...

VUE写后台管理(2)

VUE写后台管理&#xff08;2&#xff09; 1.环境2.Element界面3.Vue-Router路由后台1.左导航栏2.上面导航条 1.环境 1.下载管理node版本的工具nvm&#xff08;Node Version Manager&#xff09; 2.安装node(vue工程的环境管理工具)&#xff1a;nvm install 16.13.0 3.安装vue工…...

RHCSA8.2

Node1 配置您的系统以使用默认存储库 配置您 的系统以使用默认存储库YUM 存储库已可以从 http://foundation0.ilt.example.com/dvd/BaseOS 和 http://foundation0.ilt.example.com/dvd/AppStream 使用配置您的系统&#xff0c;以将这些位置用作默认存储库[rootclear ~]# cat …...

修改linux中tomcat的端口

随便修改一个 以8055为例子 开放8081端口 firewall-cmd --permanent --add-port8081/tcp firewall-cmd --reload firewall-cmd --list-all...

学妹学Java(一)

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; Hello&#xff0c;亲爱的各位友友们&#xff0c;好久不见&#xff0…...

湖南省副省长秦国文一行调研考察亚信科技

9月5日&#xff0c;湖南省人民政府党组成员、副省长秦国文一行到亚信科技调研考察&#xff0c;亚信科技高级副总裁陈武主持接待。 图&#xff1a;双方合影 在亚信科技创新展示中心&#xff0c;秦国文了解了亚信科技在5G、算力网络、人工智能、大数据等前沿领域的创新探索&…...

k8s部署redis 3主3从

k8s部署redis6节点&#xff0c;组成3主3从集群模式 一般来说&#xff0c;redis部署有三种模式。 单实例模式&#xff0c;一般用于测试环境。 哨兵模式 集群模式后两者用于生产部署 哨兵模式 在redis3.0以前&#xff0c;要实现集群一般是借助哨兵sentinel工具来监控master节点…...

Vue2安装vuex和vue-router报错处理

Vue2安装vuex和vue-router报错处理 Vue2.6安装VuexVue2.6安装vue-router Vue2.6安装Vuex 报错信息 处理方法 #查看vuex版本 npm view vuex versions --json #安装合适版本 npm install vuex3.6.2 --saveVue2.6安装vue-router 报错信息 处理方法 #查看vue-router版本 npm…...

算法leetcode|79. 单词搜索(rust重拳出击)

文章目录 79. 单词搜索&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 79. 单词搜索&#xff1a; …...

2023年高教社杯全国大学生数学建模竞赛参赛事项注意

MathClub数模资源&#xff0c;含专属思路 资源链接&#xff1a;点击这里获取众多数模资料、思路精讲、论文模板latex和word、学习书籍等 2023高教社杯数学建模国赛–赛前准备 一年一度的数学建模国赛要来啦&#xff01;&#xff01;&#xff01;小编仔细阅读了比赛官方网站上…...

数学建模--逻辑回归算法的Python实现

首先感谢CSDN上发布吴恩达的机器学习逻辑回归算法任务的各位大佬. 通过大佬的讲解和代码才勉强学会. 这篇文章也就是简单记录一下过程和代码. CSDN上写有关这类文章的大佬有很多,大家都可以多看一看学习学习. 机器学习方面主要还是过程和方法. 这篇文章只完成了线性可分方面的任…...

Qt6_贪吃蛇Greedy Snake

贪吃蛇Greedy Snake 1分析 首先这是一个贪吃蛇界面&#xff0c;由一个长方形边框和一只贪吃蛇组成 默认开局时&#xff0c;贪吃蛇身体只有3个小方块&#xff0c;使用画笔画出 1.1如何移动 对于蛇的移动&#xff0c;有2种方法 在一定时间范围内(定时器)&#xff0c;未对游戏…...

Credo推出业界首款单片集成CMOS VCSEL驱动器的800G光DSP芯片

针对AOC及短距&#xff08;SR&#xff09;光模块优化的新型Credo DSP&#xff0c;适用于下一代超大规模数据中心/AI应用 加州圣何塞和中国深圳&#xff0c;2023年9月6日——Credo Technology&#xff08;纳斯达克股票代码&#xff1a;CRDO&#xff09;今日发布两款新品&#x…...

【经验分享】如何使用VSCode对比两个文件

问题&#xff1a; 当有两个不同版本的文件&#xff0c;如何使用VSCode对比两个文件 解决办法 长按ctrl选择想要对比的两个文件-----右键选择将已选项进行比较----大功告成 大功告成...

从裸机开始安装ubuntu系统到安装NVIDIA驱动

这篇文章为总结类文章&#xff0c;更多的是把各个博主的内容总结一下&#xff0c;形成一套端到端的方法&#xff0c;主要内容包括&#xff1a; 安装ubuntu22.04版本(含启动U盘制作)配置ssh、固定ip和端口号安装NVIDIA驱动安装cuda11.7和cudnn8.6 文章目录 一、安装ubuntu22.041…...

索尼 toio™ 应用创意开发征文|小巧机器,大无限,探索奇妙世界

文章目录 前言微型机器人的未来&#xff1a;toio™小机器人简介toio™小机器人&#xff1a;创新功能一览toio™小机器人&#xff1a;多领域的变革者toio™小机器人贪吃蛇游戏代码实现写在最后 前言 当我们谈到现代科技的创新时&#xff0c;往往会联想到复杂的机器和高级的编程…...

什么牌子的led台灯质量好?热门的Led护眼台灯推荐

led台灯有环保无污染、耗能低、长寿命等优点&#xff0c;适合用在阅读、书写、批阅等办公或学习的场所。而挑选LED台灯时&#xff0c;分散光挡板做的比较好的优先选择&#xff0c;能分散大量蓝光&#xff0c;对眼睛危害较小。下面&#xff0c;小编为大家推荐五款质量好的led护眼…...

预推免,保研------长安大学保内,附加分面试准备【记录帖】

&#x1f680;长安大学——人工智能系——程惠泽 &#x1f68c;前六学期专业排名&#xff1a;7/82 &#x1f68c;信息门户GPA&#xff1a;3.94 &#x1f68c;平均成绩&#xff1a;89.83 &#x1f68c;加权成绩&#xff1a;89.15 / ☁️本人比较菜&#xff0c;只能保研本校&…...

Linux开源防病毒引擎ClamAV

ClamAV官方地址&#xff1a;https://www.clamav.net 它支持Linux、BSD、windows、Mac OS X等系统。 在CentOS 8&#xff08;Tencent OS 3.1&#xff09;安装非常便利&#xff0c;可以使用yum。 yum install clamav 安装成功&#xff0c;就可以使用它进行病毒扫描检查了。 c…...

Java复习-25-单例设计模式

单例设计模式 目的&#xff08;使用场景&#xff09; 在实际开发下&#xff0c;会存在一种情况&#xff1a;某一种类在程序的整个生命周期中&#xff0c;只需要实例化一次就足够了。例如&#xff0c;系统数据类&#xff0c;由于操作系统只有一个&#xff0c;因此在程序初始化…...

博客系统自动化测试项目实战(测试系列9)

目录 前言&#xff1a; 1.博客前端页面测试用例图 2.测试用例的代码实现 2.1登录页面的测试 2.2博客列表页面的测试 2.3写博客测试 2.4博客详情页面的测试 2.5已发布博客的标题和时间的测试 2.6注销用户的测试 结束语&#xff1a; 前言&#xff1a; 之前小编给大家讲…...

刚做的网站适合做外链吗/苏州seo

是40&#xff0c; 在建立数据表的时候要注意一下&#xff0c; 用char类型就可以了转载于:https://www.cnblogs.com/souroot/archive/2012/10/20/2732456.html...

网络营销的网站建设/怎么策划一个营销方案

原标题&#xff1a;小程序日活超4亿&#xff0c;近10万商家开通直播&#xff0c;私域红利已来 &#xff01;9 月 9 日晚间消息&#xff0c;在 2020 腾讯全球数字生态大会微信专场上&#xff0c;微信团队透露&#xff0c;截止 2020 年8 月&#xff0c;小程序日活超过 4 亿&#…...

制作网络游戏/网站seo推广方案

Oracle Application配置移植工具在ARP中的应用Oracle Migration Tools Introduce卢景秀摘要&#xff1a;ARP的所级部分主要是在ORACLEERP的基础上构架完成的。在我们的日常维护中&#xff0c;经常碰到因为需求变更&#xff0c;系统发生改变的情况&#xff0c;通常的做法是在一个…...

网站用excel做数据库/软件测试培训

出处&#xff1a;基于coreslam的2d-slam建图无需ros 的说明全网总结 - 机器人车技术开发分享网slam 建图当前最流行的是基于ROS平台的gmapping &#xff0c;cartographer等,ros平台相对庞大&#xff0c;roslaunch rosrun 指令操作复杂。对于研究者有大把时间的人可以放开了去学…...

有了域名如何建设网站/windows优化大师怎么用

2019独角兽企业重金招聘Python工程师标准>>> 一、性能问题分类 除了交互、视觉、内容方面的问题外&#xff0c;在用户使用过程中&#xff0c;给用户造成烦恼的问题都可以归结为是性能问题&#xff0c;比如上文中列出的这些都属于性能问题&#xff0c;按照影响的方面…...

wordpress 3.2/seo网站关键词排名提升

&#xfeff;&#xfeff;引子 Android Framework的音频子系统中&#xff0c;每一个音频流对应着一个AudioTrack类的一个实例&#xff0c;每个AudioTrack会在创建时注册到AudioFlinger中&#xff0c;由AudioFlinger把所有的AudioTrack进行混合&#xff08;Mixer&#xff09;&am…...