堆排序(向下调整)

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

 

堆排序就是将数组想象成一个二叉树,我们利用上面的数组举例。

 堆排序的原理就是取一个数组中最大的值,将这个值放入数组最后,忽略数组最后的值,再取数组最大的值,再放入最后,忽略数组最后的值,一直循环...........直到数组只剩一个值那么这个完整的数组就已经完成了排序。

那么要怎么取得数组中最大的值呢,这个问题可以通过向下的调整解决.

非子叶节点:有子叶的节点,有一个子叶也是。

子叶节点:没有子叶的节点

从数组最后一个非子叶节点开始一直到最顶端的节点开始,每个节点向下调整,如果下面两个数中有一个节点数值大于自己那么就和这个节点交换位置,如果交换完了之后下面两个节点中还是有节点数值大于自己那么继续和它交换位置,一直交换到下面没有节点数值大于自己或自己已经是在最低端,从上面最后一个非子叶4节点开始,一直到最顶端节点0,向下调整

如上图所示,通过向下调整10被调整到了二叉树的最顶端, 

第一次调整后的结果

再将最顶端节点与最后的子叶节点交换在进行调整再交换再调整一直到二叉树剩一个节点,便实现了堆排序 

代码实现

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void AdjustDwon(int* a, int n, int root)
{
	int leaf = root * 2 + 1;
	while (leaf <= n )
	{
		if (leaf + 1 <= n && a[leaf] < a[leaf + 1])
		{
			leaf++;
		}
		if (a[root] < a[leaf])
		{
			swap(&a[root], &a[leaf]);
		}
		else
		{
			break;
		}
		root = leaf;
		leaf = root * 2 + 1;
	}
}
void HeapSort(int* a, int n)
{
	int end = n - 1;
	while (end > 0)
	{
		int root = (end - 1) / 2;
		for (int i = root; i >= 0; i--)
		{
			AdjustDwon(a, end, i);
		}
		swap(&a[0], &a[end]);
		end--;
	}
}

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

相关推荐

全网首发:香橙派5MAX安装ubuntu20.04(换了官方桌面)及ros,运行LIVOX-mid360混合固态激光雷达,实际测试fastlio(只能说可以跑,还是有点吃力)

独家发布!!!香橙派5MAX安装ubuntu20.04(换了官方桌面)及ros,运行mid360混合固态激光雷达,测试fastlio(只能说可以跑,还是有点吃力),国货也算崛起了。

2402_82745259的博客 6001

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

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

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

Advanced Installer打包避坑指南:如何正确配置64位系统下的Java环境与注册表条件(以15.7版本为例)

本文详细解析了使用Advanced Installer 15.7版本在64位系统下打包Java应用时的常见问题与解决方案。重点介绍了注册表重定向机制、Java环境检测的双保险策略、环境变量设置的隐藏坑以及权限管理的进阶技巧,帮助开发者避免安装包在用户机器上无法运行的幽灵问题。

weixin_28676289的博客 325

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

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

weixin_43962381的博客 993

NR/5G - On demand SI

NR中系统消息如MIB -可用于无线帧同步等,SIB1 -小区物理信道公共配置等,是驻留一个小区所必需获得的信息,这类系统信息小区是进行周期性广播。 在SI的配置中,系统消息分为BroadCasting和non-BroadCasting,BroadCasting类系统消息基站也是周期性进行广播的,而non-BroadCasting类系统消息则是通过一种on-demand的方式,即如果需要读取这类系统消息,那么UE需要先发送请求给基站,基站响应UE之后,再下发系统消息。 ...

6777

匈牙利算法解决指派问题清晰流程

匈牙利算法解决指派问题清晰流程 百度词条上,指派问题(Assignment problem)是这么定义的:在满足特定指派要求条件下,使指派方案总体效果最佳。如:有若干项工作需要分配给若干人(或部门)来完成;有若干项合同需要选择若干个投标者来承包:有若干班级需要安排在若干教室里上课等。   一、做减法(归约): 行归约:每行元素减去该行最小元素。 列归约:每行元素减去该行最小元素。

siss0siss的博客 6万+

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

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

2501_91839423的博客 739

FPGA新手必看:Quartus生成jic文件全流程详解(附AS/JTAG模式选择指南)

本文详细解析了在Quartus中生成JIC文件以固化FPGA程序到Flash的全流程。核心在于理解JIC文件作为连接JTAG调试与AS固化的桥梁作用,并重点阐述了Convert Programming Files工具的关键配置步骤、AS与JTAG模式的选择逻辑,以及烧录过程中的常见问题排查指南,帮助开发者实现程序断电不丢失。

weixin_29271053的博客 277

堆排序——向下调整

堆排序——向下调整

qq2127189274的博客 207

【测试】echo发送和接收TCP/UDP数据包|shell 发送TCP/UDP数据包

目录 通过/dev/tcp、/dev/udp shell给tcp或udp服务发送16进制报文指令 通过/dev/tcp、/dev/udp (https://blog.youkuaiyun.com/u010039418/article/details/86251470) 通过/dev/tcp、/dev/udp可以直接在shell脚本中发起tcp、udp连接,方便又高效,平时用于测试啥的还是挺方便的。 直接发送 格式 /dev/udp/ip/port 比如要向本地10001端口发送数据,可以使用 ec.

我的笔记本 1万+

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 508

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

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

2401_83883881的博客 2346

AUTOSAE软件配置-达芬奇( DaVinci Configurator)从新建工程开始

方法1,直接使用案例工程,一般SIP包会有一个创建好的案例工程,在这样的路径YOUR_SIP_DIR/Applications/SipAddon/StartApplication下面直接打开这个*.dpa文件即可看到已经预先做好的工程:但是,这个也不是全的,也不一定完全正确,至少MCAL是没有配置好的(MCAL是IC厂商提供的,并不归属SIP包的一部分)。这样就需要你自己去配置你想要的模块,修改里面的错误。

m0_49148264的博客 2948

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

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

PixelShoal的博客 923

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

2502_92159017的博客 411

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

weixin_43045799的博客 1646

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

m0_73724954的博客 320

[排序算法] 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

堆排序(向下调整)

再将堆顶最大的那个数和最后一个位置的数进行交换,再将剩下的数据排序成大堆,再将堆顶数据和堆最后一个数据交换,循环这样的操作一直到剩下最后一个数,便完成了排序。将二叉树构建成一个大堆使最顶端的数据是最大值,再将最顶端的数据和最后一个数据交换后,最后一个数据不动始终不变,将剩余的数据继续进行上面的思路一直到排完为止。这个函数可以将二叉树里某个位置的数据向下调整,如果这个数据的下面那个数据值比它大,那么这两个数据交换位置,一直到这个数据下面的值比它要小停止,比如我们随机创建一个数组。而堆排序的的思路就是。

Visual_progress的博客 248

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

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

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

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

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

2401_84166811的博客 773

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

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

m0_74044018的博客 2691

堆排序效率低?因为你还没掌握向下调整的3大优化策略

掌握C语言堆的向下调整算法,显著提升堆排序效率。本文详解其在数组原地建堆、Top-K问题中的应用,通过减少冗余比较、优化递归调用和边界判断三大策略,提高运行速度。理解核心调整逻辑,让堆操作更高效,值得收藏。

FastSolve的博客 362
上一篇: 堆排序(向下调整)
下一篇: 取一个文件中最大的k个值(运行内存有限)
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值