【八大数据排序法】堆积树排序法的图形理解和案例实现 | C++
第二十一章 堆积树排序法
目录
第二十一章 堆积树排序法
●前言
●认识排序
1.简要介绍
2.图形理解
3.算法分析
●二、案例实现
1.案例一
● 总结
前言
排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。
认识排序
排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。
一、堆积树排序法是什么?
1.简要介绍
堆积树排序法是选择排序法的改进版,它减少了在选择排序法中的比较次数,从而提高了时间效率。堆积排序法用到了二叉树的技巧,它是利用堆积树去完成排序的。
2.图形理解
堆积树是一种特殊的二叉树,可以分为最大堆积树和最小堆积树:
最大堆积树需要满足的条件: |
① 它是一棵完全二叉树 |
② 树根的值是堆积树中最大的 |
③ 所有节点的值都大于或等于它左右子节点的值 |
最小堆积树需要满足的条件: |
① 它是一棵完全二叉树 |
② 树根的值是堆积树中最小的 |
③ 所有节点的值都小于或等于它左右子节点的值 |
(1)首先我们来理解如何将二叉树转化成堆积树的操作步骤。我们将下面如图所示表示数列(33,20,19,27,38,95,68,1,14)的二叉树进行转化:
将该二叉树中所有节点的值用数组存储起来,即tree[0],tree[1],tree[2],tree[3],tree[4],tree[5],tree[6],tree[7],tree[8]。
①tree[0]=33为树根,因为tree[1]=20<tree[0],故不交换位置。
②因为tree[2]=19<tree[0],故不交换位置。
③因为tree[3]=27>tree[1],故交换位置。具体情况如下图所示:
④因为tree[4]=38>tree[1],故交换位置。具体情况如下图所示:
⑤因为tree[5]=95>tree[2],故交换位置。具体情况如下图所示:
⑥因为tree[6]=68<tree[2],故不交换位置。
⑦再将树根tree[0]=33与其已经交换后的tree[1]=38,tree[2]=95比较,因为tree[0]<tree[1]<tree[2],所以树根与最大的交换位置。具体情况如下图所示:
⑧继续扫描树根子节点的情况,左子节点满足情况,右子节点不满足需要交换位置。因为tree[6=68]>tree[2]=33,故交换位置。且交换位置后,tree[0]=95>tree[2]=68,所以不交换。具体情况如下图所示:
⑨因为tree[7]=1<tree[3],故不交换位置。
⑩因为tree[8]=14<tree[3],故不交换位置,所以经过十个步骤过程,我们也就完成了由二叉树向堆积树的一个完整的转化过程。
(2)上面我们示范的是一棵最大堆积树的建立方法(从上往下建立)。堆积树并非唯一,如果从数组的最后一个元素,从下往上逐一比较也可以去建立一棵最大堆积树,并且通过堆积树排序法得到的数列大小是从大到小的。如果想从小到大排序,就必须去建立最小堆积树,方法与建立最大堆积树方法一致,只需注意表格中最小堆积树需满足的条件即可。下面我们用堆积排序法对(1)进行从大到小的排序:
①已经堆积树具体情况如下图所示:
②将95从树根删除,重新建立堆积树,如下图所示:
③将68从树根删除,重新建立堆积树,如下图所示:
④将38从树根删除,重新建立堆积树,如下图所示:
⑤将33从树根删除,重新建立堆积树,如下图所示:
⑥将27从树根删除,重新建立堆积树,如下图所示:
⑦将20从树根删除,重新建立堆积树,如下图所示:
⑧将19从树根删除,重新建立堆积树,如下图所示:
⑨将14从树根删除,重新建立堆积树,如下图所示:
⑩将1从树根删除,从而完成了最终的排序,如下图所示:
3.算法分析
①堆积树排序法在所有情况下,时间复杂度都为O()。
②堆积树排序法不是稳定排序法。
③堆积树排序法只需要一个额外的空间,空间复杂度为O(1)。
二、案例实现
1.案例一
①范例情况:用堆积树排序法对随机8个数据下的数列进行从小到大的排序。
②代码情况:
#include<iostream>
using namespace std;
#define size 9 //事先声明 数据元素+1
class tree {
public:int data[size];void showresult() {for (int i = 1; i < size; i++)cout << data[i] << " ";cout << endl;}void tree_start(int i,int len) {int j = 2 * i,temp=data[i],post=0;while (j <= len && post == 0){if (j < len) {if (data[j] < data[j + 1]) //找出大节点j++;}if(temp>=data[j]){ //若树根较大,则结束比较过程post = 1;}else { //若树根较小,则继续进行比较data[j / 2] = data[j];j = 2 * j;}}data[j / 2] = temp; //指定树根为父节点}void tree_sort_start() {for (int i = size / 2; i > 0; i--) //建立堆积树的结点tree_start(i,size-1);cout << "原始堆积树的内容:"; showresult();for (int j = size - 2; j > 0; j--){int temp;//头尾结点继续交换temp = data[j + 1];data[j + 1] = data[1];data[1] = temp;tree_start(1,j); //处理剩余节点}}
};
void text()
{tree t;cout << "请输入要排序的" << size-1 << "个数据" << endl;for (int i = 1; i < size; i++)cin >> t.data[i];cout << "排序前:";t.showresult();t.tree_sort_start();cout << "排序后:";t.showresult();
}
int main()
{text();
}
③结果展示:
总结
以上就是堆积树排序法的所有内容,因为在上面我们做了比较详细的讲解,所以在总结这部分不做太多的解释与说明。
<您的三连和关注是我最大的动力>
🚀 文章作者:Keanu Zhang 分类专栏:算法之美(C++系列文章)
相关文章:

【八大数据排序法】堆积树排序法的图形理解和案例实现 | C++
第二十一章 堆积树排序法 目录 第二十一章 堆积树排序法 ●前言 ●认识排序 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ● 总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增…...

低代码开发平台|生产管理-生产加工搭建指南
1、简介1.1、案例简介本文将介绍,如何搭建生产管理-生产加工。1.2、应用场景在主生产计划列表中下达加工后,在加工单列表可操作领料、质检。2、设置方法2.1、表单搭建1)新建表单【产品结构清单(BOM)】,字段…...

Python类型-语句-函数
文章目录类型动态类型:变量类型会随着程序的运行发生改变注释控制台控制台输入input()运算符算术关系逻辑赋值总结语句判断语句while循环for循环函数链式调用和嵌套调用递归关键字传参在C/java中,整数除以整数结果还是整数,并不会将小数部分舍弃…...
真兰仪表在创业板开启申购:募资约20亿元,IPO市值约为78亿元
2月9日,上海真兰仪表科技股份有限公司(下称“真兰仪表”,SZ:301303)开启申购,将在深圳证券交易所创业板上市。本次上市,真兰仪表的发行价为26.80元/股,市盈率43.06倍。 据贝多财经了解…...

【2023】Prometheus-Prometheus与Alertmanager配置详解
记录一下Prometheus与Alertmanager的配置参数等内容 目录1.Prometheus1.1.prometheus.yml1.2.告警规则定义2.alertmanager2.1.alertmanager.yml2.1.1.global:全局配置2.1.1.1.以email方式作为告警发送方2.1.1.2.以wechat方式作为告警发送方2.1.1.3.以webhook方式作为…...

华为HCIE学习之openstack基础
文章目录一、Openstack各种文件位置二、Openstack命令操作1.使用帮助三、用命令发放云主机1、创建租户2、创建用户并与租户绑定3、注册镜像4、创建规格5、创建公有网络及其子网(做弹性IP用)6、创建私有网络及其子网7、创建路由并设置网关与端口8、创建安…...

Python实现贝叶斯优化器(Bayes_opt)优化BP神经网络分类模型(BP神经网络分类算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器,用来寻找最优参数。贝叶斯优化器是基…...

Elasticsearch(九)搜索---搜索辅助功能(下)--搜索性能分析
一、前言 上篇文章我们学习了ES的搜索辅助功能的一部分–分别是指定搜索返回的字段,搜索结果计数,分页,那么本次我们来学习一下ES的性能分析相关功能。 二、ES性能分析 在使用ES的过程中,有的搜索请求的响应比较慢,…...

化繁为简|中信建投基于StarRocks构建统一查询服务平台
近年来,在证券服务逐渐互联网化,以及券商牌照红利逐渐消退的行业背景下,中信建投不断加大对数字化的投入,尤其重视数据基础设施的建设,期望在客户服务、经营管理等多方面由经验依赖向数据驱动转变,从而提高…...

2023数字中国创新大赛·数据开发赛道首批赛题启动报名
由数字中国建设峰会组委会主办的2023数字中国创新大赛(DCIC 2023)已正式启幕,本届大赛结合当下数字技术发展的热点和业界关注的焦点,面向产业实际需求设置了九大赛道。其中,数据开发赛道2月8日正式上线首批赛题&#x…...
MySQL数据库
1.MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景? 1.1事务处理上方面 MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。 InnoDB:提供事务…...

鸿蒙设备学习|快速上手BearPi-HM Micro开发板
系列文章目录 第一章 鸿蒙设备学习|初识BearPi-HM Micro开发板 第二章 鸿蒙设备学习|快速上手BearPi-HM Micro开发板 文章目录系列文章目录前言一、环境要求1.硬件要求2.软件要求3.Linux构建工具要求4.Windows开发工具要求5.工具下载地址二、安装编译基础环境1.安装Linux编译环…...

软件测试标准流程
软件测试的基本流程大概要经历四个阶段,分别是制定测试计划、测试需求分析、测试用例设计与编写以及测试用例评审。因此软件测试的工作内容,远远没有许多人想象的只是找出bug那么简单。准确的说,从一个项目立项以后,软件测试从业者…...
Python身份运算符
Python身份运算符身份运算符用于比较两个对象的存储单元运算符描述实例isis 是判断两个标识符是不是引用自一个对象x is y, 类似 id(x) id(y) , 如果引用的是同一个对象则返回 True,否则返回 Falseis notis not 是判断两个标识符是不是引用自不同对象x is not y &a…...

linux 安装,卸载jdk8
1>安装1 xshell,xsftp 教育版下载 https://www.xshell.com/zh/free-for-home-school/ 2下载jdk包 https://www.oracle.com/java/technologies/downloads/3在usr下新建java文件夹把jdk包拉进去解压tar -zxvf 4首先使用vim打开etc目录下的profile文件 --> vim /etc/profile…...

标准舆情监测平台解决方案及流程,TOOM舆情监测工作计划有哪些?
舆情监测流程一般包括:数据收集、数据分析、信息汇报三个部分。首先,通过多种途径收集舆情数据,如网络媒体、社交媒体、博客、论坛等;其次,对收集的数据进行分析,统计舆情趋势、舆情类型等;最后,根据舆情分…...
Lombok使用总结
文章目录介绍Lombok原理常用注解DataGetterSetterToStringEqualsAndHashCodeNoArgsConstructorAllArgsConstructorRequiredArgsConstructorAccessors(chain true)遇到的问题谨慎使用Data问题总结Builder和Data不能共用解决介绍 官网:https://projectlombok.org/ …...
Qt 如何处理耗时的线程,不影响主线程响应 QApplication::processEvents)
事件原因: 前些时间遇到一个问题,在主线程接收子线程读的数据,一直接收不到,但放在子线程没有问题; 后面查了一下,因为接收子线程使用了 qApp->processEvents(); 查了一下 qApp->processEvents(); …...

Antd-table全选踩坑记录
目录 一、需求 二、问题 编辑三、解决 四、全选选中所有数据而不是当前页 一、需求 最近遇到一个小小的需求,在我们这个项目中,有一个表格需要添加全选删除功能。这还不简单吗,于是我找到andt的官网,咔咔咔一顿cv࿰…...

防灾必看,边滑坡安全预警解决方案
一、行业背景在我国大部分地区经常会有雨季发生,大量的雨水渗透到了土壤内部,长时间饱含雨水的土壤会变得很重而且还会减少与下方岩石之间的摩擦力,顺着山坡这个滑梯滑下去,造成崩塌、滑坡、泥石流等地质灾害。地质灾害每年都是有…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...