【数据结构】堆排序

大家好,我是苏貝,本篇博客带大家了解堆排序,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 一. 堆的概念
  • 二. 堆排序(以升序为例)
  • 三. 代码

一. 堆的概念

如果有一个关键码的集合K,把它的所有元素按 完全二叉树 的顺序存储方式存储在一个一维数组中,并满足:任意一个双亲结点的值<=孩子节点的值(或任意一个双亲结点的值>=孩子节点的值),则称为小堆(或大堆)。堆排序即利用堆的思想来进行排序

在这里插入图片描述
在这里插入图片描述


二. 堆排序(以升序为例)

思路:

1.将待排序的数组构成一个大堆,此时堆顶元素就是最大的
2.将堆顶元素与最后一个元素交换,此时最后一个元素就是最大值
3.删除最后一个元素(实际上没有删除,只是不再和其它元素一起构成大堆),让其它元素再次构成大堆
4.重复第2、3步:将堆顶元素与最后一个元素(其实是倒数第二个)交换,此时它就是最大值(其实是次大值)……

1
为什么不用小堆?

因为小堆只能保证孩子节点的值>=双亲结点的值,不能保证兄弟节点也是按升序排列的,如:

在这里插入图片描述
从上面我们可以看出,该数组最后并不是升序排列的,因此我们不能构建小堆

2
如何构建大堆?

【数据结构】实现堆
在上篇博客中,我们在实现堆时,在插入函数中用了向上调整的方法,在这里我们同样也可以采用向上调整的方法。插入第二个元素判断位置是否合适,如果该节点的值>双亲结点的值就向上调整,调整结束后,再插入并判断第三个元素是否合适……循环结束,大堆也就构建好了。

在这里插入图片描述

//void AdjustUp(int* a, int child)
//{
//	int parent = (child - 1) / 2;
//	while (child > 0)
//	{
//		if (a[child] > a[parent])
//		{
//			swap(&a[child], &a[parent]);
//			child = parent;
//			parent = (child - 1) / 2;
//		}
//		else
//		{
//			break;
//		}
//	}
//}
for (int i = 1; i < n; i++)
	{
		AdjustUp(a, i);
	}

3
将堆顶元素与最后一个元素交换,然后删除最后一个元素(实际上没有删除)

在这里插入图片描述

//void AdjustDown(int* a, int size, int parent)
//{
//	int child = parent * 2 + 1;
//	while (child < size)
//	{
//		if (child + 1 < size && a[child + 1] > a[child])
//		{
//			child++;
//		}
//		if (a[parent] < a[child])
//		{
//			swap(&a[parent], &a[child]);
//			parent = child;
//			child = parent * 2 + 1;
//		}
//		else
//		{
//			break;
//		}
//	}
//}

    int end = n - 1;//n是数组的元素个数
	while (end > 0)
	{
		swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		end--;
	}

4
建大堆的另一种思路

上面的2利用了插入思想,从第二个元素插入开始判断位置是否合适,不合适就向上调整,调整结束后,再插入并判断第三个元素是否合适……也就是说,在再次插入元素之前,所有的元素已经构成了大堆,插入元素后,再次调整直到为大堆。那如果我一次性插入所有的元素,此时双亲结点和孩子节点没有任何关系,是否还有方法能建成大堆呢?
在这里插入图片描述
从第一个非叶子节点开始,不断向前移动,直到到根节点,每个节点都向下调整。i = (n - 1 - 1) / 2中,n-1是最后一个节点的索引,(孩子节点-1)/ 2==双亲结点的索引

for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

5
向上和向下调整建堆的时间复杂度

在这里插入图片描述

在这里插入图片描述

因为向上调整的时间复杂度为O(N*logN),向下调整的时间复杂度为O(N),所以向下调整的方法(上面的4)更好。


三. 代码

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

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

void AdjustUp(int* a, int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

void AdjustDown(int* a, int size, int parent)
{
	int child = parent * 2 + 1;
	while (child < size)
	{
		if (child + 1 < size && a[child + 1] > a[child])
		{
			child++;
		}
		if (a[parent] < a[child])
		{
			swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}

}

//升序
void HeapSort(int* a, int n)
{
	//1.建大堆
	/*for (int i = 1; i < n; i++)
	{
		AdjustUp(a, i);
	}*/


	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	//2.排序
	int end = n - 1;
	while (end > 0)
	{
		swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		end--;
	}
}

int main()
{
	int a[] = { 2,4,3,1,9,6,7,8 };
	int n = sizeof(a) / sizeof(int);
	HeapSort(a, n);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能便捷|AIRIOT智慧充电桩管理解决方案

现如今随着对可持续交通的需求不断增加&#xff0c;电动车市场正在迅速扩大&#xff0c;建设更多更智能的充电桩&#xff0c;并通过管理平台提高充电设施的可用性和效率成为一项重要任务。传统的充电桩管理平台在对充电设施进行管理过程中&#xff0c;存在如下痛点&#xff1a;…

Spring AOP(二) — 底层组件

Spring AOP 是通过动态代理的方式来实现&#xff0c;主要是通过Pointcut、Advice、Advisor及ProxyFactoryBean 等接口来创建代理对象。 在IoC容器中&#xff0c;Advice 是一个bean&#xff08;这样可以在通知中使用其他的bean&#xff09;&#xff0c;而Pointcut虽然不是一个B…

【官宣】2024广州国际酒店工程家具及商业空间展览会

2024广州国际酒店工程家具及商业空间展览会 Guangzhou International Hotel Engineering Furniture and commercial space exhibition 2024 时间&#xff1a;2024年12月19-21日 地点&#xff1a;中国进出口商品交易会展馆 承办单位&#xff1a;广州佛兴英耀展览服务有…

同步服务器操作系统公网仓库到本地 _ 统信UOS _ 麒麟KYLINOS

原文链接&#xff1a;同步服务器操作系统公网仓库到本地 | 统信UOS | 麒麟KYLINOS 在如今快速发展的信息技术时代&#xff0c;维护和更新服务器操作系统变得越来越重要。无论是为了提高安全性、增加新功能还是提升系统稳定性&#xff0c;同步公网源仓库到本地都是一个关键步骤。…

Flask入门三(Flask-session的使用、数据库链接池、wtforms、Flask定制命令、Flask-Cache)

文章目录 一、Flask-session使用1.使用方式一2.使用方式二3.读RedisSessionInterface源码4.flask-session补充 二、数据库连接池1.flask中使用mysql2.上述问题解决 使用数据库连接池1.第三方数据库连接池2.操作数据库不带池版3.池版和非池版压测 三、wtforms四、Flask定制命令1…

数据结构部分

来源地址 一 数据结构 1 堆和树之间的区别 区别就在于树是没有特定顺序的&#xff0c;你需要遍历整个树才能找到特定元素&#xff1b;而堆是有序的&#xff0c;你可以直接找到最大&#xff08;或最小&#xff09;的元素。 堆&#xff1a;假设你正在开发一个任务调度系统&…

IOS使用Unity容器动态加载3D模型

项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。 对于Unity容器来说,需要满足如下的功能: 1.在APP启动时,需要满足动态下载最…

CCF-A推荐会议 安全界顶会ACM CCS‘24 4月29日第二轮投稿!共建更安全的数字世界!

会议之眼 快讯 第31届ACM CCS (ACM Conference on Computer and Communications Security)即计算机和通信安全会议将于 2024 年 10月14日-18日在美国盐湖城举行&#xff01;CCS是美国计算机协会(ACM)安全、审计与控制特别兴趣小组(SIGSAC)主办的一年一度的重要会议。是SIGSAC的…

每周一练--[NewStarCTF 2023 公开赛道]Final

很明显又是ThinkPHP的漏洞&#xff0c;上周还做过类似的。 先看看是哪一个版本的。 得到版号后&#xff0c;去找找payload。 (post&#xff09;public/index.php?scaptcha (data) _method__construct&filter[]system&methodget&server[REQUEST_METHOD]ls -al 这其…

PDF控件Spire.PDF for .NET【安全】演示:加密 PDF 文档

加密PDF是人们常用的保护PDF的方法。无论对于公司还是个人&#xff0c;使用PDF加密来设置一些限制都是必不可少的。为了使PDF文档可供未经授权的用户阅读但无法修改&#xff0c;加密的PDF文档需要两个密码&#xff1a;所有者密码和用户密码。本节将特别介绍一种通过 Spire.PDF …

政安晨:【深度学习处理实践】(一)—— 卷积神经网络入门

深度学习的卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;是一种广泛应用于图像识别、计算机视觉和自然语言处理等领域的深度学习模型。 CNN的主要特点是它能够自动从原始数据中学习特征表示&#xff0c;而无需手动特征工程。这是通过…

2024经济管理、互联网技术与数据分析国际会议(EMITDA2024)

2024经济管理、互联网技术与数据分析国际会议(EMITDA2024) 一、【会议简介】 2024经济管理、互联网技术与数据分析国际会议&#xff08;EMITDA2024&#xff09;旨在汇集来自全球各地的专家、学者和业界领袖&#xff0c;共同探讨经济管理、互联网技术和数据分析领域的最新研究成…

【漏洞复现】网康科技 NS-ASG 应用安全网关 SQL注入漏洞(CVE-2024-2022)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【开源】JAVA+Vue.js实现企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

[CSAWQual 2019]Web_Unagi ---不会编程的崽

不知道刷了多少天了&#xff0c;又是一题关于xxe漏洞的。 web的习惯性操作。 1.功能点&cms 2.源代码 3.敏感文件泄露 当然这是我个人的习惯。这里进入界面后又upload功能&#xff0c;不会是传马吧。但是旁边给了上传文件格式。仅仅只看界面似乎没什么区别&#xff0c;源…

985硕的4家大厂实习与校招经历专题分享(part2)

我的个人经历&#xff1a; 985硕士24届毕业生&#xff0c;实验室方向:CV深度学习 就业&#xff1a;工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 &#xff08;只看大厂&#xff0c;面试…

Leetcode刷题(二十)

一、45. 跳跃游戏 II 代码&#xff1a; class Solution:def jump(self, nums: List[int]) -> int:start step 0end 1n len(nums)while end < n:max_num 0for i in range(start,end):max_num max(max_num, inums[i])start,end,step end,max_num 1,step1return st…

水库大坝安全评价导则:大坝运行管理评价

一、一般规定 1、大坝运行管理评价的目的是&#xff0c;为安全鉴定提供大坝的运行、管理及性状等基础资料&#xff0c;作为大坝安全综合评价及分类的依据之一。 2、大坝运行管理评价的内容包括大坝运行、维修和监测。 3、大坝运行管理的各项工作应按相应的规范&#xff0c;结合…

卢晶:智能座舱中的音频交互技术 | 演讲嘉宾公布

一、智能车载音频 I 分论坛 智能车载音频 I 分论坛将于3月27日同期举办&#xff01; 我们正站在一个前所未有的科技革新的交汇点上&#xff0c;重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融&#xff0c;智慧、便捷与未来的探索之旅正式扬帆起航…

Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用!

今天&#xff0c;我们宣布一个激动人心的里程碑&#xff1a;Anthropic 的 Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用。 下一代 Claude (Claude 3) 的三个模型 Claude 3 Opus、Claude 3 Sonnet 和 Claude 3 Haiku 将陆续登陆 Amazon Bedrock。Amazon …