堆排序-调整算法

个人主页点这里!~


1.堆


了解堆排序首先要了解一下这个数据结构

堆(Heap)是一种特殊的树形数据结构,它通常被表示为一个完全二叉树或近似完全二叉树,并且满足堆性质(Heap Property)。堆主要分为两种:大堆(Max Heap)和小堆(Min Heap)。

我们有一个待排序数组{5,4,7,9,3,2,6,1},将他层序遍历为堆,如下图

在堆中,我们在做一个大堆要保证大的元素始终在小的上面,做一个小堆时,要保证小的元素始终在大的上面,所以我们需要实现两种调整函数:

  1. 向上调整(adjustup)

    • 操作方向:从子节点向父节点移动数据。
    • 目的:当在堆的底部插入一个新的元素时,或者当一个元素的值增加并可能破坏堆的性质时,需要向上调整来保持堆的性质。具体来说,如果一个节点的值大于其父节点的值(在最大堆中),或者小于其父节点的值(在最小堆中),那么这个节点就需要与其父节点交换位置,并且这个过程可能需要继续向上进行,直到堆的性质被恢复。
      void AdjustUp(HPDataType* 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;}}
      }
      
  1. 向下调整(adjustdown)

    • 操作方向:从父节点向子节点移动数据。
    • 目的:当从堆顶删除一个元素(通常是根节点),或者当一个元素的值减小并可能破坏堆的性质时,需要向下调整来保持堆的性质。具体来说,新的根节点(或从堆的末尾移到根节点的元素)可能与它的子节点之一或两个都不满足堆的性质,这时就需要将这个节点与其较大的子节点(在最大堆中)或较小的子节点(在最小堆中)交换位置,并且这个过程可能需要继续向下进行,直到堆的性质被恢复。
      void AdjustDown(HPDataType* a, int n, int parent)
      {int child = parent * 2 + 1;while (child < n){if (a[child] > a[child + 1] && child + 1 < n){child++;}if (a[child] < a[parent])//СڽС{Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
      }
      

2.堆排序(排升序)

我们如何利用堆这个结构实现排序呢?

第一步:建堆

  1. 那我们排升序是建大堆还是建小堆呢?

先说结论排升序建大堆,降序建小堆

我们先用反证法:我们排升序建一个小堆,看看会出现什么情况

我们排升序此时1,2,3,4,5位置已经正确了,但我们排剩下的数据时无法高效的排序,难道把剩下的数据拿出来再建堆,那消耗就太大了,并且节点之间关系全乱了,兄弟变父子,父亲变兄弟(我把你当兄弟,你却想当我爸爸)(比如7和6,本来是兄弟,再建堆就变成了兄弟)

所以我们不能建小堆,应该建大堆,那大堆的性质帮助我们如何解决你?看第二步

第二步:排序

我们建一个大堆

因为我们建一次大堆将最大的元素放到了堆顶

所以我们首先将堆顶的最大元素与最后一个元素交换位置,

然后把最大的元素踢出,因为在最后,所以堆不会产生向上面的问题

最后再建大堆,就找出第二大的元素在堆顶,如此往复

//   堆排序
void HeapSort(int* a, int n)
{
// 总结:升序建大堆 
//      降序建小堆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]);// 选出次小的--end;AdjustDown(a, end, 0);}
}

分享到这里   个人主页点这里!~

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

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

相关文章

【web前端开发】标签(基础知识详解)

浏览器能识别的标签 编码 <meta charset"UTF-8"> title <title>helloshh</title> 标题 <h1>1级标签</h1> <h2>2级标签</h2> <h3>3级标签</h3> <h4>4级标签</h4> <h5>5级标签</h5> &…

【Mtk Camera开发学习】01 MTK 平台Camera BringUp

本专栏内容针对 “知识星球”成员免费&#xff0c;欢迎关注公众号&#xff1a;小驰行动派&#xff0c;加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 这篇文章主要介绍MTK 平台&#xff0c;Camera BringUp会涉及到修改的模块。 MTK不同的平台系列&#xff0c;具体修改…

mysql order by后跟case when

在SQL中&#xff0c;ORDER BY子句用于对查询结果进行排序。当在ORDER BY后面使用CASE语句时&#xff0c;它的原理是&#xff1a;根据CASE语句中定义的条件和结果&#xff0c;为查询结果集中的每一行生成一个临时的排序值。然后&#xff0c;根据这些排序值对结果集进行排序。 具…

突发!凌晨4点某制造业大厂国产数据库集群故障...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

GIT生成SSH公钥图文教程

参考&#xff1a;GIT生成SSH公钥图文教程-CSDN博客 这样做好之后&#xff0c;如果要在D盘目录下载代码&#xff0c;则把id_rsa和id_rsa.pub拷贝到对应目录下 不能使用ToitoiseGit下载代码&#xff0c;只能使用Git Bash下载文件 git clone ssh://xxx.git

vivado DIAGRAM、HW_AXI

图表 描述 块设计&#xff08;.bd&#xff09;是在IP中创建的互连IP核的复杂系统 Vivado设计套件的集成商。Vivado IP集成器可让您创建复杂的 通过实例化和互连Vivado IP目录中的IP进行系统设计。一块 设计是一种分层设计&#xff0c;可以写入磁盘上的文件&#xff08;.bd&…

深入解析Kafka消息传递的可靠性保证机制

深入解析Kafka消息传递的可靠性保证机制 Kafka在设计上提供了不同层次的消息传递保证&#xff0c;包括at most once&#xff08;至多一次&#xff09;、at least once&#xff08;至少一次&#xff09;和exactly once&#xff08;精确一次&#xff09;。每种保证通过不同的机制…

AI绘画中的图像格式技术

在数字艺术的广阔天地里&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;正在逐渐占据一席之地。不同于传统绘画&#xff0c;AI绘画依赖于复杂的算法和机器学习模型来生成图像&#xff0c;而这一切的背后&#xff0c;图像格式技术发挥着至关重要的作用。图像格式不仅关系…

量化视频1---qmt实盘交易链接,提供源代码

量化视频1---qmt实盘交易链接&#xff0c;提供源代码 量化视频1---qmt实盘交易链接&#xff0c;提供源代码 (qq.com) 源代码 from qmt_trader.qmt_trader import qmt_tradertraderqmt_trader(path rD:/国金QMT交易端模拟/userdata_mini, session_id 123456…

在Java、Java Web中放置图片、视频、音频、图像文件的方法

在Java软件中放置图片&#xff0c;通常涉及将图片文件&#xff08;如JPEG、PNG等&#xff09;作为资源包含在我们的项目中&#xff0c;并在代码中通过适当的方式引用这些资源。这可以通过多种方式实现&#xff0c;但最常见的是在Java桌面应用&#xff08;如Swing或JavaFX&#…

CTF Show MISC做题笔记

MISCX 30 题目压缩包为misc2.rar,其中包含三个文件:misc1.zip, flag.txt, hint.txt。其中后两个文件是加密的。 先解压出misc1.zip, 发现其中包含两个文件&#xff1a;misc.png和music.doc。其中后面文件是加密的。 解压出misc.png,发现图片尾部有消息&#xff1a;flag{flag…

最新区块链论文速读--CCF A会议 CCS 2023 共25篇 附pdf下载(2/4)

Conference&#xff1a;ACM Conference on Computer and Communications Security (CCS) CCF level&#xff1a;CCF A Categories&#xff1a;network and information security Year&#xff1a;2023 Num&#xff1a;25 第1~7篇区块链文章请点击此处查看上篇 8 Title: P…

【C/C++】IO流

目录 前言&#xff1a; 一&#xff0c;C语言的I/O流 二&#xff0c;C的I/O流 2-1&#xff0c;C标准IO流 2-2&#xff0c;IO流的连续输入 前言&#xff1a; “流”即是流动的意思&#xff0c;是物质从一处向另一处流动的过程&#xff0c;是对一种有序连续且具有方向性的数据…

测试基础11:测试用例设计方法-等价类划分

课程大纲 1、概述 1.1测试用例设计方法意义 穷举测试&#xff1a;每种输入都测一次。最完备&#xff0c;但不现实。 使用设计方法&#xff0c;用最少的数据&#xff08;成本&#xff09;&#xff0c;实现最大的测试覆盖。 1.2常用设计方法 ①等价类划分 ②边界值分析 ③错误推…

Python采集东方财富网股票数据建立LSTM模型预测

Python采集东方财富网股票数据建立LSTM模型预测 一、数据爬取流程二、爬虫完整代码三、LSTM模型建模预测3.1 项目背景3.2 建模预测流程3.3 数据预处理3.4 数据可视化3.5 特征工程3.6 数据缩放3.7 数据转换3.8 模型创建3.9 评价模型3.10 可视化结果3.11 总结一、数据爬取流程 先…

运维开发(DevOps):加速软件交付的关键方法

1. 什么是运维开发 运维开发&#xff08;DevOps&#xff09;是将软件开发&#xff08;Development&#xff09;与信息技术运维&#xff08;Operations&#xff09;的流程整合在一起的实践方法。DevOps的目标是通过增强开发和运维团队之间的协作&#xff0c;提高软件产品的发布…

Linux路由设置

添加路由 一&#xff1a;使用 route 命令添加 使用route 命令添加的路由&#xff0c;机器重启或者网卡重启后路由就失效了&#xff0c;方法&#xff1a; //添加到主机的路由 # route add –host 192.168.1.11 dev eth0 # route add –host 192.168.1.12 gw 192.168.1.1 //添…

【计算机视觉】数字图像处理基础:以像素为单位的图像基本运算(点运算、代数运算、逻辑运算、几何运算、插值)

0、前言 在上篇文章中&#xff0c;我们对什么是数字图像、以及数字图像的组成&#xff08;离散的像素点&#xff09;进行了讲解&#x1f517;【计算机视觉】数字图像处理基础知识&#xff1a;模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类。 我们知道&a…

【ARM Cache 与 MMU 系列文章 7.3 – ARMv8/v9 MMU 块描述符与页表描述符】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 上篇文章&#xff1a;【ARM Cache 系列文章 7.2 – ARMv8/v9 MMU 页表配置详细介绍 03 】 文章目录 MMU 块描述符与页描述符Block DescriptorBlock descriptor formatsBlock Entry 介绍Block En…

Linux驱动应用编程(四)IIC(获取BMP180温度/压力数据)

本文目录 一、基础1. 查看开发板手册&#xff0c;获取可用IIC总线2. 挂载从机&#xff0c;查看从机地址。3. 查看BMP180手册&#xff0c;使用命令读/写某寄存器值。4. 查看BMP180手册通信流程。 二、IIC常用API1. iic数据包/报2. ioctl函数 三、数据包如何被处理四、代码编写流…