堆排序(向下调整)

堆,向下调整算法,向上调整算法,数组建堆算法,堆排序,建堆时间复杂度的推理 目录:1.堆2.堆的实现2.1堆的向下调整算法(建小堆)2.2 堆向下调整算法(建小堆)实现2.3 数组建堆算法(建小堆)2.4 数组建堆算法(建小堆)实现2.5 堆排序(降序)2.6 堆排序(降序)实现2.7 建堆的时间复杂度 1.堆 大根堆:所有父节点大于等于孩子节点 小根堆:所有父节点小于等于孩子节点 堆的性质: • 堆中某个节点的值总是不大于或不小于其父节点的值 • 堆总是一棵完全二叉树 2.堆的实现 现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它 阅读详情

堆排序对写程序很重要 因为它比冒泡排序更省时间 时间复杂度更小

堆排序针对的是数组 将数据变换成一个二叉树 用这种模型来进行排序 是数组变得有序

比如我们随机创建一个数组

int a[] = { 9,5,7,3,5,4,6,8,25,36,15};


 

这就是初始的二叉树

而堆排序的的思路就是

将二叉树构建成一个大堆使最顶端的数据是最大值,再将最顶端的数据和最后一个数据交换后,最后一个数据不动始终不变,将剩余的数据继续进行上面的思路一直到排完为止。

我们需要引入一个函数

void Adjustdown(HPDataType*a,int n,int parent)
{
	assert(a);
	int child = (parent * 2) + 1;
	while (child < n)
	{
		if (child<n - 1 && a[child]<a[child + 1])
		{
			child++;
		}
		if (a[parent] < a[child])
		{
			swap(&a[parent], &a[child]);
			parent = child;
			child = (parent * 2) + 1;
		}
		else
		{
			break;
		}
	}
}

这个函数可以将二叉树里某个位置的数据向下调整,如果这个数据的下面那个数据值比它大,那么这两个数据交换位置,一直到这个数据下面的值比它要小停止,

通过循环从这个二叉树最后一个非子叶(此位置下面有两个数据)开始一直到第一个非子叶数,其中每个子叶数都向下调整一次,从而构建出了大堆(二叉树中的每个位置的数据都大于它下面两个数)

再将堆顶最大的那个数和最后一个位置的数进行交换,再将剩下的数据排序成大堆,再将堆顶数据和堆最后一个数据交换,循环这样的操作一直到剩下最后一个数,便完成了排序。
 

void heapsort(HPDataType* hp, int n)
{
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		Adjustdown(hp, n, i);
	}
	int end = n - 1;
	while (end>0)
	{
		swap(&hp[0], &hp[end]);
		Adjustdown(hp, end, 0);
		end--;
	}
}

整体代码


void Adjustdown(HPDataType*a,int n,int parent)
{
	assert(a);
	int child = (parent * 2) + 1;
	while (child < n)
	{
		if (child<n - 1 && a[child]<a[child + 1])
		{
			child++;
		}
		if (a[parent] < a[child])
		{
			swap(&a[parent], &a[child]);
			parent = child;
			child = (parent * 2) + 1;
		}
		else
		{
			break;
		}
	}
}
void heapsort(HPDataType* hp, int n)
{
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		Adjustdown(hp, n, i);
	}
	int end = n - 1;
	while (end>0)
	{
		swap(&hp[0], &hp[end]);
		Adjustdown(hp, end, 0);
		end--;
	}
}
int main()
{
	int a[] = { 9,5,7,3,5,4,6,8,25,36,15,78,2};
	int n = sizeof(a) / sizeof(int);
	heapsort(a, n);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
}

面试考点--堆(向下调整算法,向上调整算法,建堆,堆排序)以及堆排序、建堆的时间复杂度分析(图文并茂) 堆 堆是一种完全二叉树,现实中通常使用顺序结构的数组来存储堆,此处的堆是一种数据结构(完全二叉树),而不是虚拟进程空间中的那个堆(是操作系统用来管理内存的一个区域分段 ) 阅读详情

相关推荐

InternVL 3.5 深度解析:开源多模态模型的新里程碑

InternVL 3.5是由上海人工智能实验室OpenGVLab团队推出的开源多模态大模型,在推理能力、效率和灵活性方面取得突破。该模型采用ViT-MLP-LLM架构,包含60亿参数的InternViT-6B视觉编码器和多种规格的语言模型骨干。核心创新包括:1)Cascade RL强化学习框架,通过离线热身和在线强化两阶段训练提升推理能力;2)ViR视觉分辨率路由器,动态调整图像处理分辨率以优化计算效率;3)DvD动态视觉token压缩技术。模型系列涵盖2B到241B参数规模,满足从边缘设备到高性能计算的不

m0_47999117的博客 1031

堆排序(向下调整法,向上调整法详解)

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

走在努力路上的自己的博客 3231

2021-8-14 EDK II编译

2021-8-14 EDK II 编译为什么要写这篇文章新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 为什么要写这篇文章 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo

qq_45775660的博客 2948

堆排序其实不难:搞懂向下调整法就够了

堆排序是一种基于完全二叉树的排序算法,利用大堆(父节点大于子节点)或小堆的性质实现排序。堆的核心操作是向下调整法,通过比较父节点与较大子节点并交换来维护堆结构。建堆过程从最后一个非叶子节点开始向前调整,将无序数组转化为大堆。堆排序的关键步骤包括:1)构建初始大堆;2)交换堆顶元素(最大值)与末尾元素;3)缩小堆范围并重新调整。最终数组呈现升序排列。堆排序的时间复杂度为O(nlogn),适合处理大规模数据。

2501_91839423的博客 739

避开这些坑!用Python ReportLab生成PDF时字体处理与中文排版的5个关键技巧

本文针对Python ReportLab库在PDF自动化生成中常见的中文排版难题,提供了五个关键技巧。内容涵盖字体注册的稳健策略、段落样式的精细控制、表格内中文的换行对齐、页面布局管理以及性能优化,旨在帮助开发者彻底解决中文乱码、排版错位等问题,生成专业美观的PDF文档。

weixin_29250403的博客 624

HSmartWindowControl vs HWindowControl:Halcon老鸟教你如何根据项目需求选对控件(附性能对比)

本文深度对比Halcon图像处理中的HSmartWindowControl与HWindowControl控件,从性能、内存占用和交互体验等维度提供选型建议。HSmartWindowControl在硬件加速渲染、智能内存管理方面表现优异,特别适合医疗影像和工业检测等高性能需求场景,而HWindowControl则更适合兼容旧系统和资源受限环境。

weixin_30765505的博客 471

【数据结构】堆排序的向下调整算法

算法解析 要明白向下调整算法首先要掌握数据结构中堆的定义(不是内存中的堆)。 1·概念:堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。 2·堆的分类:最大堆:每个父节点的值都大于孩子节点。最小堆:每个父节点的值都小于孩子节点 向下调整算法的作用就是通过从上到下的算法排序,将任意一个堆变成最小堆或者最大堆。 步骤:(此处以最小堆为例) 1、从根节点的左右孩子中选取一个较小值min 2、当前需要调整的数据与较小值min进行比较 ①、大于min:和min进行交换,从交换后的位置继续执行第1步; ②

weixin_43962381的博客 993

微信小程序 - 最新实现项目适老化设计全流程及源码,老年模式大字版与常规版页面样式切换,老年人大字模式字体与布局更换关怀版解决方案(新老项目均适用的方案,全局页面统一修改文本字号/DOM排版元素等)

微信小程序,vue2,vue3,老年大字版设计,小程序开发如何实现适老化方案,放大字体字号及改变页面的布局,小程序关怀模式实现思路及代码,统一将布局都改了,全局修改字体大小适配老年人看不清问题,小程序怎么接入老年模式并根据模式改变页面的UI设计,实现全局修改字体大小适老化/关怀版改造,最新详细示例代码全流程,字体放大/缩小,老项目怎么适配老年人模式方案,小程序适老化设计指南,当切换成老年模式时页面所有排版都会发生变化,小程序vue开发,新手详细教程,老年模式字体设置思路和UI布局的设计,开发者可以通过wx.

🏆 前端领域优质创作者 7311

堆排序——向下调整

堆排序——向下调整

qq2127189274的博客 207

使用C#实现的多人语音视频系统:WebSocket与WebRTC集成

通过上述的代码示例,我们可以使用C#编写一个多人语音视频系统,该系统集成了WebSocket和WebRTC技术。当然,这只是一个简单的示例,实际的多人语音视频系统可能需要更多的功能和优化。通过结合这两种技术,我们可以实现实时的语音和视频通信,支持多人同时参与。在上述代码中,我们创建了一个WebSocket服务器,监听在本地的8080端口,并创建了一个WebRTC连接。接下来,我们将详细介绍如何使用C#编写一个多人语音视频系统,包括使用WebSocket建立连接和使用WebRTC进行实时通信。

TjsReact的博客 1635

Ardupilot chibios IO固件,IO与FMU通信,固件下载(3)

目录 文章目录目录摘要 摘要 本节主要记录自己学习IO与FMU通信

陌城烟雨 2801

堆排序(详解:向上调整算法&向下调整算法)

利用堆的结构特点进行排序。同时借此详细介绍了向上调整算法和向下调整算法

2401_83883881的博客 2346

学Simulink——基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制系统设计与仿真方法。SST作为智能电网关键设备,包含AC-DC整流、DC-DC隔离和DC-AC逆变三级变换器。针对级间耦合问题,提出了能量-功率协同控制策略,通过纵向解耦和横向联动实现稳定运行。详细演示了在Simulink中搭建三级主电路、设计协同控制器(含电网定向控制、功率前馈和虚拟惯性控制)的全过程,并通过负载突变测试验证了系统动态性能(直流母线电压波动<2%)。最后给出了工程部署建议,包括数字控制延时补偿、启动序列设计和代码自动生成

xiaoheshang_123的博客 207

从【向上调整,向下调整】到【堆排序】

一.主要包括向上调整和向下调整两种建堆方式。 对于升序排序,需要先建立大堆; 对于降序排序,则需要先建立小堆。 二.文章详细展示了两种调整方式的代码实现,并说明了如何通过交换堆顶和堆底元素进行排序。 【无论是升序还是降序,最终都使用向下调整来完成堆排序】

2502_92159017的博客 411

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

为什么你的堆排序总是出错?一文看懂C语言向下调整算法精髓

掌握C语言堆的向下调整算法,轻松解决堆排序出错难题。详解其在堆构建与维护中的核心作用,通过递归与迭代实现方法,提升效率与稳定性。理解关键步骤,避免常见错误,值得收藏。

PixelShoal的博客 923

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

堆排序(建堆及向下调整)

首先,堆排序顾名思义,它的数据存储的像一个堆一样,那么想一下,像堆的数据类型都有什么? 树形结构! 所以,堆排序的存储就是通过一颗完全二叉树实现的,可以理解成满了,但没完全满 为什么这样说,原因很简单,它的n-1层组成的二叉树必须是满二叉树,但是叶子结点组成的第n层可以不满,但是有一个前提条件 假设根节点编号为1,两个子节点为2,3,那么2和3的子节点空余的顺序必须有序,就是说,4,5,6这三个叶子结点必须满足按顺序(也即是说,若6这个叶子结点存在,那么前面的说有叶子结点不可以空缺) 讲完了基本的性质,考

weixin_43045799的博客 1646

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

向上调整和向下调整以及堆排序的时间复杂度

本章节将分享向上调整法和向下调整法以及堆排序时间复杂度的计算方法以及总结先说总结:向上调整法时间复杂度O(N) = NlogN向下调整法的时间复杂度O(N) = N堆排序的时间复杂度O(N) = N+NlogN以上就是今天要讲的内容,本篇文章着重讲解了向上调整和向下调整以及堆排序的时间复杂度的计算过程,更多知识分享内容今后将会持续更新,敬请关注!

m0_73724954的博客 320

堆排序(向下调整)

选中一个数据将它和自己直接连接的上面那个数据比较如果最上面那个数据大小小于自己 那么交换位置 交换位置继续和上面那个数据进行比较 直到遇到比自己大的数据停止交换或当自己位于最顶端时停止交换。向上排序函数的参数有两个 一个是数组的地址(堆)一个是要进行排序的位置hp是堆的地址 i是要进行排序的位置那么现在再来到2.用向上排序函数实现堆排序。

Visual_progress的博客 350

[排序算法] 8. 堆排序及模拟实现堆(选择排序,堆排序,向下调整)

文章目录1. 基本思想1.1 复习数据结构---堆1.2 堆的概念1.3 堆的性质1.4 堆的实现1.4.1 堆的AdjustDown向下调整算法1.4.2 堆的创建1.4.3 堆的插入与AdjustUp向下调整算法1.4.4 堆的删除1.4.5 堆排序1.4.6 模拟实现堆2. 代码实现3. 性能分析 1. 基本思想 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法...

Y-puyu 的博客 969

数据结构 | 堆的实现 向上调整算法 向下调整算法 堆排序

本次我们学习到了堆的相关知识,堆本质上就是一个数组。然后我们又学习了【向上调整算法】和【向下调整算法】,知道了它们的时间复杂度【向上调整算法】它的时间复杂度为O(NlogN),【向下调整算法】它的时间复杂度为O(N);所以平时要优先使用向下调整算法。接着我们又学习了堆排序,它是八大排序算法之一,它的时间复杂度为O(NlogN);最后我们学习了TOP-K问题–即求数据结合中前K个最大的元素或者最小的元素。以上就是本文的全部内容了,若有问题请在评论区留言,觉的好的话就留下你的三连吧。

2301_77412625的博客 1165

【数据结构】长篇详解堆,堆的向上/向下调整算法,堆排序及TopK问题

😗:其实两种方式建堆之所以时间复杂度有差距,就是因为向下调整建堆可以看作忽略了最后一排的节点,直接从倒数第二排节点开始调整的,而在一棵满二叉树中最后一排的节点其实就占据了整棵树的二分之一,所以相当于向下调整比向上调整少经历了很多的节点所以实际堆排序中我们更多的使用的是。

kklovecode的博客 1726

数据结构 | 堆的向上调整和向下调整算法【奇妙的堆排序】

详细介绍有关数据结构【堆】的向上调整算法和向上调整算法,内附分布式分析算法图

做技术人 · 产优质博客 · 找好工作 1977

数据结构 堆的向上调整和向下调整算法【奇妙的堆排序】

对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。讲了那么久的堆,学习了两种调整算法以及它们的时间复杂度分析,接下去我们来说说一种基于堆的排序算法——【堆排序】对于堆的创建这一块,有两种方法,一种是直接利用我们上面所写的【Init】和【Push】联合。对堆这一块还有一个经典的问题就是Top - K:即求数据结合中。说了这么多,还不知道写得代码到底对不对,我们来测试一下。,一般情况下数据量都比较大。

2401_84166811的博客 773

【数据结构】堆的实现(向下调整和向上调整法)和堆排序的实现

【数据结构】详解向上调整法和向下调整法,用向下调整法建堆,堆排序的实现,堆的操作,和复杂度的分析等等

m0_74044018的博客 2691

【C语言堆排序核心技巧】:掌握向下调整算法的3大关键步骤

掌握C语言堆排序核心,深入解析堆的向下调整算法三大关键步骤。适用于优先队列构建与堆排序优化,提升算法效率。详解调整逻辑、边界处理与复杂度优势,助你彻底理解堆结构维护原理,值得收藏。

FastSolve的博客 460
上一篇: 设计循环队列
下一篇: 堆排序(向下调整)
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值