重温算法导论(六) 堆排序

UR10e+D435+ag95夹爪 gazebo 仿真记录(一) 学习仿真环境gazebo下利用UR10e机械臂搭建模拟平台,此博客用于记录搭建过程!!主要参考光头明明、总有一天全城的人都要高看我们和bug404_三位博主。最终自己功能包的主要参考了bug404_的ur_platform,感觉这个结构比较合理。运行环境:Ubuntu18.04+Ros-melodic+Gazebo9。 阅读详情

堆排序,思想就是先建立最大堆,然后从最大堆中取出最大数,作为数组的最后一个数据,重复并把数据取完。

排序的数组结构,包含堆数组的长度,有效的堆大小 和堆数据

A{
	length
	heap-size
	A[]
}

每个节点对应的父节点,左子节点,右子节点

维护最大堆的性质,先假定先假定Left[i] 和Right[i] 为最大堆,MaxHeapify(A,2)过程


实现伪代码:

MaxHeapify(A, i)	//先假定Left[i] 和Right[i] 为最大堆
	l = Left(i)
	r = Right(i)
	if l <= A.heap-size and A[i] < A[l]
		largest = l
	else
		largest = i
	if r <= A.heap-size and A[r] > A[largest]
		largest = r
	if largest != i
		exchange A[i] <=> A[largest]
		MaxHeapify(A, largest)

创建最大堆,从下往上实现子堆最大堆,

前提定理:

过程:


伪代码如下

BuileMaxHeap(A)
	A.heap-size = A.length
	for i = (A.length /2) downto 1
		MaxHeapify(A, i)

堆排序,从最后一个数据与第一个数据交换,并减少堆的有效大小,过程如下



伪代码如下:

HeapSort(A) 堆排序
	BuileMaxHeap(A)
	for i = A.length downto 2
		exchange A[1] , A[i]
		A.heap-size = A.heap-size -1
		MaxHeapify(A, 1)

以下为C++实现代码:

//堆排序
template<class T> struct StuA {
	int iLenth;
	int iHeapSize;
	T *A;
};

inline int Parent(int i){
	return (i+1)/2-1;
}
inline int Left(int i) {
	return 2*i + 1;
}
inline int Right(int i) {
	return 2*i +2;
}
//假定LEFT 和right 子树都是最大堆
template<class T> void MaxHeapify(StuA<T> stu, int i)
{
	int l = Left(i), r = Right(i), ilargest;
	if(l < stu.iHeapSize && stu.A[i] < stu.A[l])
		ilargest = l;
	else 
		ilargest = i;
	if(r < stu.iHeapSize && stu.A[r] > stu.A[ilargest])
		ilargest = r;
	if (i != ilargest){
		ExchangeT(stu.A[i], stu.A[ilargest]);
		MaxHeapify(stu, ilargest);
	}
}

template<class T> void BuildMaxHeap(StuA<T> stu)
{
	for(int i = stu.iHeapSize / 2 -1; i>=0; i--)
	{
		MaxHeapify(stu, i);
	}
}

template<class T> void HeapSort(StuA<T> stu)
{
	BuildMaxHeap(stu);
	for (int i = stu.iLenth -1 ; i> 0; i--)
	{
		ExchangeT(stu.A[i], stu.A[0]);
		stu.iHeapSize = stu.iHeapSize -1 ;
		MaxHeapify(stu, 0);
	}
}
int main(int argc, char* argv[])
{
//	int iData[10] = {16, 4, 10, 14, 7, 9, 3, 2,8,1};
	int iData[10] = {4,1,3,2,16,9,10,14,8,7};
	StuA<int> objA;
	objA.A = iData;
	objA.iHeapSize = objA.iLenth = 10;
	//BuildMaxHeap(objA);
	HeapSort(objA);
}


[LVGL] 刷新率优化 实验硬件:STM32F407ZGT6;2.4寸TFT-LCD模块(ILI9341驱动芯片、XTP2046触摸芯片)本文目标:lvgl的刷新率优化,解决拉帘子问题注意:本文在LVGL显示触摸代码移植完成的基础上进行,第一次使用lvgl可根据前文一步步移植,点击下方传送门查看相关文章传送门:STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(一)STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(二)[LVGL] 显示代码移植 基于STM32F4。 阅读详情

相关推荐

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7711

排序七之堆排序

Heap Sort 一种基于选择排序思想,利用堆结构和二叉树的一些性质来完成数据排序的排序算法。  堆排序的关键是构造堆结构,准确而言,堆结构即是一个完全二叉树,树中的每一个节点对应原始数据的一个记录。每个节点应满足以下条件: 1)从小到大排序:要求非叶结点的数据要大于或等于其左、右子节点的数据。 2)从大到小排序:要求非叶节点的数据要小于或等于其左、右子节点的数据。 一个完整的堆排序需

Like_BC 505

STM32duino LSM6DSO驱动库:低功耗IMU工程化实践

惯性测量单元(IMU)是智能终端与工业设备实现运动感知的核心传感器,其性能关键在于数据精度、实时响应与系统功耗的协同优化。LSM6DSO作为集成加速度计与陀螺仪的六轴MEMS器件,依托片上有限状态机(FSM)和机器学习核心(MLC),支持自由落体检测、计步器、6D方向识别等硬件自治功能,显著降低主控CPU负载。在STM32平台下,通过深度耦合HAL/LL库、显式引脚管理、DMA加速SPI传输及EXTI中断协同,可实现亚毫秒级事件响应与微安级待机功耗。本文聚焦STM32duino生态中LSM6DSO驱动的工程

weixin_36304957的博客 552

堆及堆排序算法(算法导论)

堆是一种二叉树,分为最大堆和最小堆。 最大堆:所有的父亲节点都大于等于其儿子节点,所以根节点最大; 最小堆:所有的父亲节点都小于等于其儿子节点,所以根节点最小; 在这里仅仅考虑最大堆。 如图是一个最大堆: 绿色数字为角标 i,而圆圈里的数字为A[ i ]的值。 堆的几个性质: A[ i ]的父亲节点是A[i/2],左儿子节点是A[2 * i],右儿子节点是A[2 *i+1]; ...

头号玩家的博客 1513

关系代数表达式优化步骤

关系代数表达式优化步骤 本篇主要讲解怎么画查询语法树并对其优化,因为我在学关系代数的语法树的时候,在网上找不到比较详细的教法或者技巧,最后通过答案反推原理,所以想写一篇技巧来描述一下这类题的解题方法。 先上书内讲解 1、构造查询树 第一步:把用高级语言定义的查询转换为关系代数表达式 ★ 以 SELECT子向对应投影操作,以FROM字向对应笛卡尔积以 WHERE子句对应选择操作,生成原始查询树 ★ SQL语句转化为原始查询树 第二步:把关系代数表达式转换为查询树。 注: 查询树是一种表示关系代数表达式的树形结

m0_51718449的博客 7016

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

qq_1432825237的博客 3991

重温经典:堆排序

堆排序是利用堆的性质进行排序的过程。堆排序包括构成初始堆和利用堆排序这两个过程,堆分成大根堆和小根堆,这里我们使用大根堆来展开讨论。 例如我们有如下一组数据和其对应的完全二叉树: {35、10、17、40、39、9、50、44、16、26} 构成初始堆就是把待排序的元素序列{R0~Rn},按照堆的定...

cyq6239075的博客 771

RAG项目简历包装指南:从“流水线工人”到“问题解决者”的跃迁(附代码与思路)

本文代码已在Python 3.11 + CUDA 12.3环境测试,部分功能需LangChain 0.2+支持。

Conan_0728的博客 1885

重温数据结构:堆,堆排序,优先队列,TopK问题

1.堆的基本概念堆实际上是一颗完全二叉树,其中,任何一个非叶子节点均满足如下性质:key[i]key[i]>=key[2*i+1]&&key[i]>=key[2*i+2] (大顶堆)其中i是从0开始的。2.堆排序的思想 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。 其基本思想为(大顶堆): 1)将初始待排

郑海波(莫川)的优快云博客 2252

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 ej2πfnte^{j2πf_nt}ej2πfn​t 都被一个矩形窗脉冲gT(t)g_T(t)gT​(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的倒数,这是子载波正交的条件。 ​ 根据时频脉冲形状,可以从时域上理解如左图(注意是矩形脉冲 乘 复指数),从频域上理解如右图(sinc脉冲 卷 频点)。 ​

weixin_43803202的博客 2215

ZYNQ 网络通信的四种实现方案

一,ZYNQ MIO以RGMII 接口连接外部PHY芯片实现LWIP网络通信。 二,ZYNQ PS 的 ENET0/ENET1 通过 EMIO 的方式扩展至 PL,在 PL 中通过 RGMII 接口连接扩展子卡实现 LWIP 网络通信。 在PL中搭建了1个AXI 1G/2.5G Ethernet Subsystem以及1个AXI Direct Memory Access IP 核。这两个 IP核均通过AXI 总线经S_AXI_HP0 口与PS 连接,PS 通过AXI 总线对其进行配置和控..

wangjie36的博客 1万+

重温堆排序及二叉堆的应用场景

堆排序 算法基本思路: 将待排序数组,看成是一个数组形式的完全二叉树(节点在层序遍历中的顺序,即是元素在数组中的顺序),先对数组进行调整,使其成为一个大根堆,或者小根堆。 调整完后,每次将堆顶元素(数组首元素),与最后一个元素交换,然后把最后一个元素从堆中删除(逻辑上删除),将剩余元素进行调整,形成一个新的堆,再把堆顶元素和堆尾元素交换,把堆尾元素删除,再调整剩余元素… 一直到堆为空,即得到一...

vcj1009784814的博客 826

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【重温基础算法】内部排序之堆排序法

堆排序

有问题的请私信或关注v【技术印记】留言 720

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

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

重温堆排序实现!

堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。 概述 若以升序排序说明,把数组转换成最大堆(Max-Heap Heap),这是一种满足最大堆性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i]。 重复从最大堆取出数值最大的结点(把根结点和最后一个结点交换,把交换后的最后一个结点移出堆),并让残余的堆维持最

美丽心情 178

WINCC7.3破解文件

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

重温《数据结构与算法》之堆与堆排序

堆与堆排序

天堂的博客 306

重温经典算法——堆排序

堆排序是一种基于二叉堆的高效排序算法,时间复杂度为O(n log n)。其核心步骤包括构建最大堆和反复取出堆顶元素排序:首先从最后一个非叶子节点开始调整构建最大堆,然后将堆顶元素与末尾元素交换,并重新调整剩余元素为新堆。

谷哥的小弟 376

【重温篇】八大排序——堆排序

首先复习一下完全二叉树:数据从上到下,从左到右依次进行排列。

Playepineapple的博客 405

堆排序建堆复杂度为O(n)的证明

今天重温堆排序,在网上搜了好多博客文章,都是泛泛而谈。有的只讲了思路,有的直接贴上一份或几份代码。好一点的对复杂度进行了分析,但是讲到建堆复杂度,就一笔带过或者说请参考算法导论××页。我觉得求建堆复杂度并不难,了解一下对于理解堆排序是有好处的,下文为求解过程。 堆排序就是借助于堆的数据结构和堆的操作函数来完成排序功能的过程。堆的数据结构可以借助于数组表示出来并可以高效地进行堆的操作。我们为堆

mtawaken的专栏 1万+

堆排序Heap Sort——浅显易懂+Java实现

最近在恶补一些计算机基础内容,看到了堆排序,想想以前常说堆栈堆栈,但我竟然连堆有哪些应用都记不得了,所以,重温了堆排序后,我来给大家分享一下,希望能对大家有所帮助。(代码实现不采用伪代码,使用java实现,毕竟来看博客的都不想和看书一样把)        首先,堆是一种数据结构,你可以把他看成一颗完全二叉树,如下图所示:圆圈上方的数字代表下标:他的特性就是:父结点的值要大于两个儿子结点的值。

qj30212的博客 1456

算法:堆排序

堆排序 最近重温了经典的堆排序的算法,堆是一种优先队列,堆排序是基于完全二叉树结构的,由选择排序优化而来,常数时间内最坏最好情况时间复杂度都是O(nlogn),而堆又分为两种,分别是大顶堆和小顶堆,由于一般排序算法都是实现序列升序化,故堆排序在一般教材里都是以小顶堆形式出现,算法实现步骤分为三步:建堆,调整堆,输出堆顶元素,废话不多说,上代码 public class 堆 { public st...

长舒的博客 241

c++堆排序的实现

今天重温了一下各大排序。 打算写一下堆排序,首先要了解它能干什么,有什么区别,定位,怎么实现 1.能干什么  对数据进行排序。(废话了) 2.和别的排序有什么区别 比插入,冒泡,选择排序效率高,但是在性能低于快排,它属于不稳定排序 3.定位 适合于大量的数据的排序。时间复杂度为O(nlgn)即使在最好和最差情况下。 4.怎么实现 a.第一步了解他的原理,就是用数组模拟一个二叉树来

jiangge123456的专栏 674

堆排序建堆复杂度为O(n)的证…

今天重温堆排序,在网上搜了好多博客文章,都是泛泛而谈。有的只讲了思路,有的直接贴上一份或几份代码。好一点的对复杂度进行了分析,但是讲到建堆复杂度,就一笔带过或者说请参考算法导论××页。我觉得求建堆复杂度并不难,了解一下对于理解堆排序是有好处的,下文为求解过程。   堆排序就是借助于堆的数据结构和堆的操作函数来完成排序功能的过程。堆的数据结构可以借助于数组表示出来并可以高效地进行堆的操作。我们为

Never too late! 495

LeetCode-补充题6-手撕堆排序

211

z754916067的博客 261

算法--堆排序实现

最近工作不忙,重温一下大学的算法学习,记录巩固一下。下面介绍一下堆排序。

weixin_43578304的博客 336

数据结构二叉树的建立代码_重温数据结构与算法之堆与堆排序

封面图1. 堆二叉树可以被细分为普通二叉树、满二叉树、完全二叉树,而今天所分享的堆这种数据结构就是一种完全二叉树。堆中的每个结点的值要么都大于左右子结点的值,要么都小于左右子结点的值。前者形成的是大顶堆,即堆顶元素是最大的;后者形成的是小顶堆,即堆顶元素是最小的。如下图所示,分表是一个大顶堆和小顶堆。堆❝完全二叉树的特点是:最后一层的叶子结点靠左排列,从根结点到倒数第二层结点,是一颗满二...

weixin_39676972的博客 132
上一篇: 重温算法导论(五) 归并排序
下一篇: 高并发服务器-无锁队列实现1 (基于ZMQ 1读1写) C++
HjasnJH
博客等级 码龄14年 12粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值