数据结构 ——— 向上/向下调整算法将数组调整为升/降序

目录

向上调整算法(默认小堆)

向下调整算法(默认小堆) 

利用向上调整算法对现有数组直接建堆

利用向下调整算法对以建成的小堆数组排降序

举一反三: 那么如何将数组 a 排成升序呢? 


向上调整算法(默认小堆)

// 数据类型
typedef int HPDataType;// 交换
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 向上调整
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;}}
}

不改变堆的结构,那么就要堆当前插入的数据向上调整
而且当前插入的数据只会影响其父亲节点,或者父亲的父亲节点,直到根节点
把当前插入的数据的下标比作 child,那么就可以通过 (child-1)/2 这个公式找到其父亲节点
再通过比较判断是否需要向上交换并且迭代
当不满足 if 条件时,说明当前插入的数据还是堆结构,直接跳出循环即可


向下调整算法(默认小堆) 

static void AdjustDown(HPDataType* 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;}}
}

向下调整算法是在把堆顶元素删除后进行的
向下调整算法的前提:根节点的左右子树已经是一个堆,才能向下调整
删除堆顶元素,要保持堆大致不变,所以把首尾元素交换,交换后删除堆顶元素也就是删除尾元素
删除后,尾元素就到了堆顶,但是要确保堆结构不变,所有要对尾元素向下调整
根据 parent*2+1 的公式,找到根节点的右孩子,左右孩子存在的情况下比较
当尾元素大于小的那个孩子就需要交换,再迭代,直到不满足 if 条件,就跳出循环
此时就完成了向下调整算法


利用向上调整算法对现有数组直接建堆

现有一个整型数组:

int a[] = { 5,7,3,9,1,8,4,6,2 };

对数组直接建堆的方法:

把数组中的第一个元素当作堆,因为堆的本质就是完全二叉树,那么只有一个元素的时候,也可以看着一颗完全二叉树,只是这颗完全二叉树只有根节点
再从数组中的第二个元素开始遍历,利用向上调整算法模拟堆的插入过程
遍历完后,数组 a 就变成了一个小/大堆

代码演示:

void HeapSort(int* a, int size)
{// 从第二个元素开始遍历for (int i = 1; i < size; i++){// 向上调整AdjustUp(a, i);}
}

代码验证:

           1

        /      \
     2          4
    /  \        /  \
  3   7      8  5

 / \
9 6


利用向下调整算法对以建成的小堆数组排降序

代码演示:

void HeapSort(int* a, int size)
{// 从第二个元素开始遍历for (int i = 1; i < size; i++){// 向上调整(建小堆)AdjustUp(a, i);}// a 数组调整为降序for (int i = size - 1; i >= 0; i--){// 首尾交换Swap(&a[0], &a[i]);// 向下调整AdjustDown(a, i, 0);}
}

代码解析:

第一个 for 循环完成了对数组 a 进行建堆,上方已有讲解
建堆之后,数组 a 此时就是一个小堆的结构
小堆结构的特点就是堆顶元素是整个堆元素中最小的元素
那我们就可以将首尾元素交换,也就是数组 a 的第一个元素和最后一个元素交换
交换后,最小的元素就排到了最后的位置,然后就不用再动最后一个元素了
把前 size-1 个元素看作新的堆,利用向下调整算法,把前 size-1 个元素建堆,同样是建小堆
建好后,那么第二小的数据就到了数组首元素的位置,再次首尾交换,重复以上动作
最后就能将数组 a 排成降序

代码验证:


举一反三: 那么如何将数组 a 排成升序呢?

第一步:
同样是利用向上调整算法对已有的数组进行建堆,但是不同的是需要建立大堆
只需要将向上调整算法中的小于符号变为大于符号

第二步:
对数组 a 建成大堆后,再利用首尾交换和向下调整算法对数组 a 进行排升序
因为数组 a 的是大堆,大堆的特点就是堆顶元素是数组所有元素中最大的数
所以首尾交换后,最大的数就在最后的位置,再把前 size-1 的元素看作新的大堆
利用向下调整算法把第二大的元素调整到堆顶,再首尾交换,把第二大的元素放在倒数第二的位置
循环结束后,数组 a 就调整成了升序数组
需要注意的是:向下调整算法也需要更改符号,要更改的是两点,一是左右孩子中,找大的,二是当堆顶元素小于左右孩子中的大那个时就交换

代码验证:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一种基于GPU的归并排序并行实现

0️⃣归并排序流程 分割过程&#xff1a;将待排序数组等分为左右子数组&#xff0c;再对左右子数组递归式等分&#xff0c;直至不可分割合并过程&#xff1a;将所有子数组两两递归合并&#xff0c;逐步得到较大有序数组&#xff0c;直到得到完整有序数组 1️⃣传统的并行归并 …

【MySQL】数据类型

目录 一、常见数据类型汇总 二、数值类型 2.1 tinyint 2.2 bit 2.3 float 2.4 decimal 三、字符串类型 3.1 char 3.2 varchar 四、日期和时间类型 五、枚举和集合 5.1 enum枚举 5.2 set集合 一、常见数据类型汇总 分类数据类型说明数值类型BIT(M)二进制位。M指定…

《探索 HarmonyOS NEXT (5.0):开启构建模块化项目架构奇幻之旅 —— 动态路由 ZRouter:引领高效模块通信的智慧中枢》

ZRouter简介&#xff1a;是一款轻量级的动态路由框架&#xff0c;基于Navigation系统路由表和Hvigor插件实现的方案&#xff0c;可以解决多个业务模块&#xff08;HAR/HSP&#xff09;之间解耦和通信问题&#xff0c;从而实现业务复用和功能扩展。 ZRouter出处ZRouter&#xff…

网络原理(数据链路层)->以太网帧格式解

前言 大家好我是小帅&#xff0c;今天我们来了解以太网帧格式 个人主页 文章目录 1.数据链路层1.1 认识以太⽹1.2 MAC地址&#xff08;⽹卡的硬件地址&#xff09;1.2.1 对⽐理解MAC地址和IP地址 1.3 认识MTU1.4 MTU对IP协议的影响1. 5 MTU对UDP协议的影响1.6 MTU对于TCP协议的…

银行金融知识竞赛活动策划方案

根据《中国人民银行**市中心支行“创新金融服务&#xff0c;支持经济发展”业务竟赛活动实施方案》安排&#xff0c;中支决定于9月28日举办**市人民银行系统“创新金融服务&#xff0c;支持经济发展”现场业务竞赛&#xff0c;为确保业务竞赛组织工作顺利开展&#xff0c;特制定…

渗透测试练习题解析 7 (CTF web)

一、[红明谷CTF 2021]write_shell 1 考点&#xff1a; 1、PHP 短标签 2、 符号的使用 通过代码可知 check 是一个过滤函数&#xff0c;利用正则的方式过滤掉 空格、php、eval 等一些关键字或符号&#xff0c;$dir 是路径&#xff0c;这个值可以通过 actionpwd 获取到&#…

VBA中类的解读及应用第十七讲:类,让文本框在激活时改变颜色(下)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

如何下载安装TestLink?

一、下载TestLink、XAMPP TestLink 下载 |SourceForge.net 备用&#xff1a;GitHub - TestLinkOpenSourceTRMS/testlink-code&#xff1a; TestLink开源测试和需求管理系统 下载XAMPP&#xff1a; Download XAMPP 注意&#xff1a;TestLink与PHP版本有关系&#xff0c;所以XA…

基于SpringBoot+微信小程序+协同过滤算法+二维码订单位置跟踪的农产品销售平台-新

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; “农产品商城”小程序…

实现旺店通到金蝶云星空的数据集成:技术详解

旺店通旗舰版数据集成到金蝶云星空案例分享&#xff1a;入库瞬时成本-生产入库单-1 在企业日常运营中&#xff0c;数据的高效流转和准确对接是确保业务顺利进行的关键。本文将聚焦于一个具体的系统对接集成案例——如何将旺店通旗舰版的数据集成到金蝶云星空&#xff0c;以实现…

selinux与防火墙

一.selinux (1).什么是selinux SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linu。 SELinux是对程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序&#xff0c;因此刚好也 是能够控制网络服务能否访问系统资源的一道关卡。 (2)…

【论文精读】LPT: Long-tailed prompt tuning for image classification

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 摘要 2. …

链表详解(三)

目录 链表功能实现链表的查找SLNode* SLFind(SLNode* phead, SLNDataType x)代码 链表任意位置前插入void SLInsert(SLNode**pphead&#xff0c;SLNode* pos, SLNDataType x)代码 链表任意位置前删除void SLErase(SLNode**pphead&#xff0c;SLNode* pos)代码 链表任意位置后插…

有php转go项目经验者优先?

新的一周又来了&#xff0c;今天分享的是上海某公司的一面面经&#xff0c;内容主要就是go、mysql和项目&#xff0c;职位要求如下&#xff1a; 发现一个很有意思的点—有php转go项目经验者优先。想不到还有这种好事&#xff0c;本人就是php转go&#xff0c;跟我有相同经历的朋…

【AI换脸整合包及教程】AI 换脸新潮流:FaceFusion 3.0.0,开启无限创意之旅

在科技飞速发展的今天&#xff0c;人工智能已经深入到我们生活的各个角落。其中&#xff0c;AI 换脸技术以其惊人的创造力和趣味性&#xff0c;吸引了无数人的目光。而在众多 AI 换脸工具中&#xff0c;FaceFusion 3.0.0 脱颖而出&#xff0c;成为了引领潮流的佼佼者。 一、AI …

【智慧中控项目】

智慧中控 前言一、搭建开发环境1.需要做什么&#xff1f;1.1 刷机和启动OrangePi Zero2&#xff08;全志H616芯片&#xff09;1.2 在PC上安装虚拟机VM&#xff08;安装VirtualBox或VMware&#xff1a;这是常用的虚拟机软件工具&#xff09;1.3 在虚拟机VM&#xff08;VirtualBo…

“短线看涨”,上升周期中,抓以小波段行情,落袋为安

使用技巧 短线看涨指标属于副图公式&#xff0c;短线怎么操作&#xff1f;看蓝色短期安全线 这个公式主要是在上升周期中&#xff0c;抓以小波段行情为主&#xff0c;落袋为安 弱水三千 只取一瓢 公式 DIFM:(EMA(C,240)-EMA(C,520)); DEAM:EMA(DIFM,180); MACD&#xff08…

21_双端 diff 算法

目录 双端比较的原理非理想状况的处理方式添加新元素移除不存在的元素 在上一节中&#xff0c;我们实现了简单的 diff 算法&#xff0c;简单的 diff 算法利用 key 属性&#xff0c;尽可能的复用 DOM 元素&#xff0c;并通过移动 DOM 元素来完成更新&#xff0c;从而减少不断创建…

微服务实战系列之玩转Docker(十六)

导览 前言Q&#xff1a;基于容器云如何实现高可用的配置中心一、etcd入门1. 简介2. 特点 二、etcd实践1. 安装etcd镜像2. 创建etcd集群2.1 etcd-node12.2 etcd-node22.3 etcd-node3 3. 启动etcd集群 结语系列回顾 前言 Docker&#xff0c;一个宠儿&#xff0c;一个云原生领域的…

注册信息的提交

动态网页是指能够根据用户的操作或输入动态变化的网页。与静态网页相比&#xff0c;动态网页具有交互性和可变性。 一 动态网页概念 动态网页通常使用脚本语言&#xff08;如JavaScript&#xff09;与服务器进行交互&#xff0c;从服务器获取数据并动态更新网页内容。常见的动…