堆排序(算法实现)

news2024/10/6 8:37:57

文章目录

  • 堆排序-算法实现
    • 1. 向上调整和向下调整比较
    • 2. 堆排序
      • 1. 升序
      • 2. 降序

堆排序-算法实现

前面介绍了堆的基本功能实现(https://blog.csdn.net/m0_46343224/article/details/127986662),了解了堆,这里用堆实现排序

1. 向上调整和向下调整比较

思考:向上调整和向下调整哪个更优?

此图解析:向上调整的时间复杂度:O(N*log2(N));向下调整的时间复杂度:O(N);则从尾向下调整优于向上调整

2. 堆排序

堆排序思路:

升序:首先建大堆,然后交换首尾数据(也就是把最大的数据放在尾部,再从头向下调整size-1个数据(也就是不对其交换后的最大的数据调整)

降序:首先建小堆,然后交换首尾数据(也就是把最大的数据放在尾部,再从头向下调整size-1个数据(也就是不对其交换后的最大的数据调整)

1. 升序

void SwapData(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

void AdjustDownSortAscending(int* a, int size, int parent)
{
	//假设默认左孩子大
	int lchild = parent * 2 + 1;

	while (lchild < size)
	{
		//确认指向大的孩子
		if (lchild + 1 < size && a[lchild + 1] > a[lchild])
		{
			++lchild;
		}
		//大堆
		//lchild + 1 < size 表示最后的父节点和左孩子对比
		if (a[parent] < a[lchild])
		{
			SwapData(&a[parent], &a[lchild]);
			parent = lchild;
			lchild = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSortAscending(int* a, int size)
{
	//建大堆(从尾元素父节点开始)
	for (int i = (size - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDownSortAscending(a, size, i);
	}

	int heapend = size - 1;
	while (heapend > 0)
	{
		SwapData(&a[0], &a[heapend]);
        //从首开始向下调整
		AdjustDownSortAscending(a, heapend, 0);
		heapend--;
	}
}

2. 降序

void SwapData(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

void AdjustDownSortDescending(int* a, int size, int parent)
{
	//假设默认左孩子大
	int lchild = parent * 2 + 1;

	while (lchild < size)
	{
		//确认指向大的孩子
		if (lchild + 1 < size && a[lchild + 1] < a[lchild])
		{
			++lchild;
		}
		//大堆
		//lchild + 1 < size 表示最后的父节点和左孩子对比
		if (a[parent] > a[lchild])
		{
			SwapData(&a[parent], &a[lchild]);
			parent = lchild;
			lchild = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSortDescending(int* a, int size)
{
	//建小堆(从尾元素父节点开始)
	for (int i = (size - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDownSortDescending(a, size,i);
	}

	int heapend = size - 1;
	while (heapend > 0)
	{
		SwapData(&a[0], &a[heapend]);
        //从首开始向下调整
		AdjustDownSortDescending(a, heapend, 0);
		heapend--;
	}
}

为什么升序建立大堆,降序建立小堆?

我们知道大堆小堆都不是连续递减或递增的,拿升序来说:如果建立小堆,那么我们不一定数据连续递增的情况时,这样就增加的时间复杂度,本来可以在O(N*log2(N))时间解决,但是这里不连续递增,就要对没有连续递增的位置上再次调整。降序建立大堆也是一样提高了不必的时间成本

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

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

相关文章

1. pip和conda的区别

Pip 或者 conda的时候经常被混合使用&#xff0c;这两者也通常被认为是几乎相同的&#xff0c;尽管他们的很多功能是重叠的&#xff0c;但它们的设计和使用目的不同。所以这次参考官方的解释&#xff0c;来进行如下总结和归纳&#xff1a;附上官方解释&#xff1a;conda和pip的…

关于Python的局部变量和全局变量使用介绍

局部变量&#xff1a;在函数中定义的变量&#xff0c;作用域是当前函数&#xff0c;只对当前函数起作用。 全局变量&#xff1a;在代码开头定义的变量&#xff0c;作用域是整段代码&#xff0c;对整段代码起作用。 先看下面的实例&#xff0c; 最后给结论。 name ‘PythonTa…

月薪9K和年薪30W的职位,有什么区别?

【浙江杭州】加速科技 测试开发工程师&#xff08;15-30W/年&#xff09; 岗位职责&#xff1a; 1、根据产品的需求编写测试用例&#xff0c;搭建软硬件联合测试环境&#xff1b; 2、对研发的模块/系统进行测试并输出测试报告&#xff1b; 3、整理并定期提交buglist&#…

我的PFC岩土颗粒流离散元分析攻略(附赠学习资料)

作者 | Lobby &#xff0c;仿真秀专栏作者 导读&#xff1a;lobby曾是国内“双一流“”院校本硕连读土木专业的大学生&#xff0c;现在从事土木相关的研发工作。目前在仿真秀官网发布过数十篇付费文章&#xff0c;含金量颇高&#xff0c;受到用户的好评。本期我们将带来lobby老…

差分 【一维差分和二维差分】

全文目录&#x1f914;一维差分&#x1f615;差分数组的构建&#x1f914;二维差分&#x1f615;差分矩阵的构建&#x1f914;一维差分 首先来了解一下差分的性质&#xff0c;差分是前缀和的逆运算&#xff0c;如果说前缀和是&#xff1a;S f(n) &#xff0c;那么差分就是 D …

轻松拿下——类的默认成员函数

六大默认成员函数&#xff1a; 1、初始化&#xff1a;构造函数主要完成初始化工作 2、清理&#xff1a;析构函数主要完成清理工作 3、拷贝复制&#xff1a;拷贝构造是使用同类对象初始化创建对象 4、拷贝复制&#xff1a;赋值重载主要是把一个对象赋值给另一个对象&#xff…

linux文件压缩、解压缩以及归档

一、文件压缩、解压缩 1.linux compress命令&#xff08;compress/uncompress&#xff09; &#xff08;1&#xff09;压缩文件&#xff1a; [rootserver ~]# du -sh passwd1---查看文件大小 [rootserver ~]# time compress passwd1---time&#xff1a;查看时间 compress&…

医学主题词表(Medical Subject Headings, MeSH)

Medical Subject Headings 简称MeSH&#xff0c;由美国国立医学图书馆&#xff08;NLM出版&#xff09;&#xff0c;是目前最权威最常用的标准医学主题词表。 MeSH由范畴表&#xff08;Categories and Subcategories&#xff09;、字顺表&#xff08;Alphabetic listing&#…

AI 边缘计算平台 - 爱芯元智 AX620A 爱芯派开箱

最近疫情有点猛&#xff0c;宅在家里&#xff0c;没事找点事干&#xff0c;撸撸板子吧。 拿出来趁着双 11 优惠&#xff0c;花了 520 RMB / 块&#xff0c;买的两块爱芯派&#xff08;套餐&#xff09;&#xff0c;来个开箱贴&#xff0c;顺便测试一下开发板的串口、网口、音频…

智慧井盖解决方案-最新全套文件

智慧井盖解决方案-最新全套文件一、建设背景行业痛点二、建设思路三、建设方案四、获取 - 智慧井盖全套最新解决方案合集一、建设背景 城市井盖是每个城市管理的难点&#xff0c;井盖数量多&#xff0c;容易发生井盖破损或丢失后出现人员与财产损失。给群众生命财产带来损害。…

基于Netty的高性能API网关设计

0. 本文目的 对于网关设计&#xff0c;业界已有很多成熟的解决方案&#xff0c;开箱即用或者稍作自定义都能满足需求。本文主要是通过网关需求了解底层netty的使用&#xff0c;所以重心在netty的实践使用上。 1. 什么是网关 网关(Gateway)又称网间连接器、协议转换器。网关在…

基于球向量的粒子群优化(SPSO)算法在无人机路径规划中的实现(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

PyTorch for Audio + Music Processing(2/3/4/5/6/7) :构建数据集和提取音频特征

基于Torchaudio构建数据集 文章目录基于Torchaudio构建数据集前言02 Training a feed forward network03 Making predictions04 Creating a custom dataset05 Extracting Mel spectrograms06 Padding audio files07 Preprocessing data on GPU一、下载数据集文件目录标注格式二…

19 【RTK Query】

19 【RTK Query】 1.目前前端常见的发起 ajax 请求的方式 1、使用原生的ajax请求2、使用jquery封装好的ajax请求3、使用fetch发起请求4、第三方的比如axios请求5、angular中自带的HttpClient 就目前前端框架开发中来说我们在开发vue、react的时候一般都是使用fetch或axios自…

web前端期末大作业【 大学生抗疫感动专题网页设计】HTML+CSS

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Prometheus 使用cadvisor采集docker容器监控数据

Prometheus采集主机监控参考部署下载&#xff0c;图形生成 系统安装Grafana downloadWindows参考图形生成参考win_exporterLinux参考node_exporterMysql参考Mysql_exporterSQL Server参考SQL exporterRedis 参考Redis_exportercadvisor参考cadvisor snmp_exporter 参考图形展示…

Redis详细教程

【尚硅谷】2021最新版Redis详细教程&#xff08;基于Redis 6.2.x版本&#xff09; 文章目录 一、前言二、NoSQL数据库简介 1.技术发展 1.1 Web1.0时代1.2 Web2.0时代1.3 解决CPU及内存压力1.4 解决IO压力 2.NoSQL数据库 2.1 NoSQL数据库概述2.2 NoSQL适用场景2.3 NoSQL不适用…

小啊呜产品读书笔记001:《邱岳的产品手记-09》第17讲 产品经理如何获得非权力性的影响力 第18讲 产品案例分析:WWFTogether的情怀设计

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-09》第17讲 产品经理如何获得非权力性的影响力 & 第18讲 产品案例分析&#xff1a;WWFTogether的情怀设计一、今日阅读计划二、泛读&知识摘录1、第17讲 产品经理如何获得非权力性的影响力&#xff1f;2、第18讲 产品…

Unity 打印安卓apk报错的日志

文章目录环境连接安卓手机附录环境 1.华为手机打开调试模式&#xff1a; 【设置】|【关于手机】|【版本号】点三次。 2.unity3d 环境设置&#xff1a; 【File】|【Building Settings】开启必备选项 &#xff08;其他非必选&#xff0c;最好勾上&#xff09;&#xff1a; D…

Sparse Merkle Tree

1. 引言 前序博客有&#xff1a; Merkle tree及其在区块链等领域的应用Merkle tree proof 2. Merkle tree Merkle tree可看成是对一组数据的密码学承诺&#xff0c;类似&#xff1a; 2.1 Merkle tree包含证明 如需证明A包含在上述树中&#xff0c;仅需要发送A, H(B), H(…