【数据结构--八大排序】之堆排序

news2024/11/30 14:29:22

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 堆排序
    • 一、🌱排降序
      • 1.思路:
      • 2.代码实现:
      • 3.测试结果
      • 4.总代码
    • 二、🌸排升序
      • 1.思路:
      • 2.代码实现:
      • 3.测试结果:
      • 4.总代码
    • 三、堆排序的时间复杂度

在这里插入图片描述

堆排序

一、🌱排降序

口诀:排降序,建小堆

1.思路:

(1)首先使用从下到上的方法建立小堆;如下图

在这里插入图片描述

(2)堆顶与最后一个节点交换,由于是小堆,堆顶是最小值。交换后,就选出了最小值并将其放到数组的组后位置,
在这里插入图片描述

(3).将堆的长度减1【end–】(数组长度减1)。
(4).在对剩下的堆进行基于小堆的向下调整,从而将第二小的数调整到了堆顶。
在这里插入图片描述

重复步骤2.3.4,end一直减到0;
4.最后,这个原本存储小堆的数组,就变成了一个从小到大的降序数组。
在这里插入图片描述

2.代码实现:

1.交换

//交换
void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

2.修改AdjustDown(a, end, 0);为调小堆


基于小堆的向下调整
```c

void AdjustDownxiao(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	//一直交换到数的最后,也就是数组的最后一个位置
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] < a[child])
		{
			child++;
		}
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			// 继续往下调整
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}

3.排降序

void HeapSortDES(int* a, int n)
{
	//建立小堆
	for (int i = (n-1-1)/2; i >= 0; i--)
	{
		AdjustDownxiao(a, n, i);
	}

	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		//每次调整从根0到end,end每次会减1。
		AdjustDownxiao(a, end, 0);
		--end;
	}
}

3.测试结果

在这里插入图片描述

4.总代码

//交换
void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
//基于小堆的向下调整
void AdjustDownxiao(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	//一直交换到数的最后,也就是数组的最后一个位置
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] < a[child])
		{
			child++;
		}
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			// 继续往下调整
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}

//降序
void HeapSortDES(int* a, int n)
{
	//建立小堆
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDownxiao(a, n, i);
	}

	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		//每次调整从根0到end,end每次会减1。
		AdjustDownxiao(a, end, 0);
		end--;
	}
}


二、🌸排升序

口诀:排升序,建大堆

意思是:想要将数组的顺序变成一个升序的,那么可以建立一个大堆存在数组中,在对堆进行调整。即可将数组变成一个升序数组。

1.思路:

首先使用从下到上的方法建立大堆;
1.堆顶与最后一个节点交换,由于是大堆,堆顶是最大值。交换后,就选出了最大值并将其放到数组的组后位置
2.并将堆的长度减1(数组长度减1)。
3.在对剩下的堆进行基于大堆的向下调整从而将第二大的数调整到了堆顶
4.最后,这个原本存储大堆的数组,就变成了一个从小到大的升序数组

2.代码实现:

1.交换

//交换
void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

2.基于大堆的向下调整

//基于大堆的向下调整
void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	//一直交换到数的最后,也就是数组的最后一个位置
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] > a[child])
		{
			child++;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			// 继续往下调整
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}

3.排升序

//排升序
void HeapSortASC(int* a, int n)
{
	//建立大堆
	for (int i = (n-1-1)/2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	int end = n - 1;
	while (end > 0)
	{
		swap(&a[0], &a[end]);
		//每次调整从根0到end,end每次会减1。
		AdjustDown(a, end, 0);
		end--;
	}
}

3.测试结果:

在这里插入图片描述

4.总代码

//交换
void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	//一直交换到数的最后,也就是数组的最后一个位置
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] > a[child])
		{
			child++;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			// 继续往下调整
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}




//升序
void HeapSortASC(int* a, int n)
{
	//建立小堆
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		//每次调整从根0到end,end每次会减1。
		AdjustDown(a, end, 0);
		end--;
	}
}

三、堆排序的时间复杂度

堆排序分两步:1.建堆(使用时间复杂度更低的向下调整建堆)2.排序

向下调整建堆的时间复杂度为O(n);
n-1次删除操作的时间复杂度为O(nlogn);
所以总操作时间复杂度为O(nlogn)

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

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

相关文章

Databend 开源周报第112期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 理解用户自定义…

【GDB】使用 GDB 自动画红黑树

阅读本文前需要的基础知识 用 python 扩展 gdb python 绘制 graphviz 使用 GDB 画红黑树 前面几节中介绍了 gdb 的 python 扩展&#xff0c;参考 用 python 扩展 gdb 并且 python 有 graphviz 模块&#xff0c;那么可以用 gdb 调用 python&#xff0c;在 python 中使用 grap…

MathType7.4最新版本下载安装教程来咯!

MathType是全球领先的所见即所得公式编辑器&#xff0c;支持书写任何类型的数学方程式。 MathType曾作为Microsoft Word内置公式编辑器&#xff0c;与微软办公套件完美兼容&#xff0c;支持WPS&#xff0c;亦可以独立单机软件使用。是为数学理工经济学习研究、学术发表的有力拍…

echarts使用custom类型绘制矩形

echarts中根据坐标点和点的宽高绘制不同大小的矩形 效果图 <template><div style"height: 100%; width: 100%"><BaseChart emitChart"emitChart" :option"option1" /></div> </template><script> export …

基于Web的在线学习平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

lwIP 开发指南(中)

目录 ARP 协议ARP 协议的简介ARP 协议的工作流程(获取目标设备 MAC 地址步骤)ARP 缓存表的超时处理 APR 报文的报文结构ARP 协议层的接收与发送原理解析发送ARP 请求数据包接收ARP 应答数据包 IP 协议IP 协议的简介IP 数据报IP 数据报结构IP 数据报的分片解析IP 数据报的分片重…

微信小程序学习笔记3.0

第3章 资讯类:仿今日头条微信小程序 3.1 需求描述及交互分析 需求描述 仿今日头条微信小程序,要具有以下功能。 (1)首页新闻频道框架设计,包括底部标签导航设计、新闻检索框设计及新闻频道滑动效果设计。 (2)首页新闻内容设计,包括新闻标题、新闻图片及新闻评论设计…

深度学习笔记之优化算法(二)随机梯度下降

深度学习笔记之优化算法——随机梯度下降 引言回顾&#xff1a;梯度下降法梯度下降法在机器学习中的问题随机梯度下降随机梯度下降方法的思想随机梯度下降方法的步骤描述关于学习率 引言 本节将介绍随机梯度下降 (Stochastic Gradient Descent,SGD) \text{(Stochastic Gradien…

102.二叉树的层序遍历

目录 一、题目 二、代码 一、题目 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 二、代码 主要应用到了两个队列&#xff0c;一个队列存放数据&#xff0c;一个队列存放对应所在的第几层 /*** Definition for a binary tree node.* struct TreeNode {* …

机器学习笔记 - 基于强化学习的贪吃蛇玩游戏

一、关于深度强化学习 如果不了解深度强化学习的一般流程的可以考虑看一下下面的链接。因为这里的示例因为在PyTorch 之上实现深度强化学习算法。 机器学习笔记 - Deep Q-Learning算法概览深度Q学习是一种强化学习算法,它使用深度神经网络来逼近Q函数,用于确定在给定状态下采…

[watevrCTF-2019]Cookie Store

很简单一道 提示了很多在cookie中 我们去看看cookie 发现是base64加密 修改大于100即可 然后买即可 。。。。。。

【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(其它指令)?

除了基础的 LDx 指令,还有 LDP、LDR 这些指令,我们也需要关注。 1 LDNP (SIMD&FP) 加载 SIMD&FP 寄存器对,带有非临时提示。该指令从内存加载一对 SIMD&FP 寄存器,向内存系统发出访问是非临时的提示。用于加载的地址是根据基址寄存器值和可选的立即偏移量计算…

建筑能源管理(2)——建筑能源的类型及统计计算方法

1、能源类型 能源也称能量资源或能源资源&#xff0c;是为人类的生产和生活提供各种能力和动力的物质资源&#xff0c;是国民经济的重要物质基础&#xff0c;也是未来国家命运的基础。能源的开发和有效利用程度以及人均消费量是生产技术和生活水平的重要标志。 2018年10月26日…

无线WIFI工业路由器可用于楼宇自动化

钡铼4G工业路由器支持BACnet MS/TP协议。BACnet MS/TP协议是一种用于工业自动化的开放式通信协议&#xff0c;被广泛应用于楼宇自动化、照明控制、能源管理等领域。通过钡铼4G工业路由器的支持&#xff0c;可以使设备间实现高速、可靠的数据传输&#xff0c;提高自动化水平。 钡…

Learning Invariant Representation for Unsupervised Image Restoration

Learning Invariant Representation for Unsupervised Image Restoration (Paper reading) Wenchao Du, Sichuan University, CVPR20, Cited:63, Code, Paper 1. 前言 近年来&#xff0c;跨域传输被应用于无监督图像恢复任务中。但是&#xff0c;直接应用已有的框架&#xf…

Android 性能优化—— 启动优化提升60%

应用启动速度 一个应用App的启动速度能够影响用户的首次体验&#xff0c;启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降&#xff0c;或者卸载放弃该应用程序 本文将从两个方向优化应用的启动速度 : 1.视觉体验优化 2.代码逻辑优化 视觉优化 应用程序启动有…

Spring Framework 学习笔记4:AOP

Spring Framework 学习笔记4&#xff1a;AOP 1.概念 AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程思想。它要解决的问题是&#xff1a;如何在不改变代码的情况下增强代码的功能。 AOP 有一些核心概念&#xff1a; 连接点&am…

OpenGL之光照贴图

我们需要拓展之前的系统&#xff0c;引入漫反射和镜面光贴图(Map)。这允许我们对物体的漫反射分量和镜面光分量有着更精确的控制。 漫反射贴图 我们希望通过某种方式对物体的每个片段单独设置漫反射颜色。我们仅仅是对同样的原理使用了不同的名字&#xff1a;其实都是使用一张…

5.图形的连续绘制

到目前为止我们已经学习了折线&#xff0c;圆弧&#xff0c;矩形的基本绘制&#xff0c;但是我们每次都是单独绘制并且只绘制一个图形的。 不知道大家有没有试过在一个画布上绘制多个图形&#xff0c;例如我现在要画一个矩形&#xff0c;一个圆形和一段折线&#xff0c;代码如下…

03. 人工智能核心基础 - 导论(2)

文章目录 从方法论上来讲从问题范式上来讲从研究对象来讲 Hi&#xff0c;你好。我是茶桁。 上一章中&#xff0c;我们谈论了人工智能在时间维度上的不同时间不同的侧重点&#xff0c;这只是一个片面的方面。当然除此之外&#xff0c;我们还要从其他方向来认识人工智能&#xf…