当前位置: 首页 > news >正文

【八大数据排序法】堆积树排序法的图形理解和案例实现 | 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(n\log2^{n})。

       ②堆积树排序法不是稳定排序法。

       ③堆积树排序法只需要一个额外的空间,空间复杂度为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.案例一 ● 总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法&#xff0c;它主要是将一堆不规则的数据按照递增…...

低代码开发平台|生产管理-生产加工搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建生产管理-生产加工。1.2、应用场景在主生产计划列表中下达加工后&#xff0c;在加工单列表可操作领料、质检。2、设置方法2.1、表单搭建1&#xff09;新建表单【产品结构清单&#xff08;BOM&#xff09;】&#xff0c;字段…...

Python类型-语句-函数

文章目录类型动态类型:变量类型会随着程序的运行发生改变注释控制台控制台输入input()运算符算术关系逻辑赋值总结语句判断语句while循环for循环函数链式调用和嵌套调用递归关键字传参在C/java中&#xff0c;整数除以整数结果还是整数&#xff0c;并不会将小数部分舍弃&#xf…...

真兰仪表在创业板开启申购:募资约20亿元,IPO市值约为78亿元

2月9日&#xff0c;上海真兰仪表科技股份有限公司&#xff08;下称“真兰仪表”&#xff0c;SZ:301303&#xff09;开启申购&#xff0c;将在深圳证券交易所创业板上市。本次上市&#xff0c;真兰仪表的发行价为26.80元/股&#xff0c;市盈率43.06倍。 据贝多财经了解&#xf…...

【2023】Prometheus-Prometheus与Alertmanager配置详解

记录一下Prometheus与Alertmanager的配置参数等内容 目录1.Prometheus1.1.prometheus.yml1.2.告警规则定义2.alertmanager2.1.alertmanager.yml2.1.1.global&#xff1a;全局配置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、创建公有网络及其子网&#xff08;做弹性IP用&#xff09;6、创建私有网络及其子网7、创建路由并设置网关与端口8、创建安…...

Python实现贝叶斯优化器(Bayes_opt)优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是基…...

Elasticsearch(九)搜索---搜索辅助功能(下)--搜索性能分析

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

化繁为简|中信建投基于StarRocks构建统一查询服务平台

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

2023数字中国创新大赛·数据开发赛道首批赛题启动报名

由数字中国建设峰会组委会主办的2023数字中国创新大赛&#xff08;DCIC 2023&#xff09;已正式启幕&#xff0c;本届大赛结合当下数字技术发展的热点和业界关注的焦点&#xff0c;面向产业实际需求设置了九大赛道。其中&#xff0c;数据开发赛道2月8日正式上线首批赛题&#x…...

MySQL数据库

1.MySQL的MyISAM与InnoDB两种存储引擎在&#xff0c;事务、锁级别&#xff0c;各自的适用场景? 1.1事务处理上方面 MyISAM&#xff1a;强调的是性能&#xff0c;每次查询具有原子性,其执行数度比InnoDB类型更快&#xff0c;但是不提供事务支持。 InnoDB&#xff1a;提供事务…...

鸿蒙设备学习|快速上手BearPi-HM Micro开发板

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

软件测试标准流程

软件测试的基本流程大概要经历四个阶段&#xff0c;分别是制定测试计划、测试需求分析、测试用例设计与编写以及测试用例评审。因此软件测试的工作内容&#xff0c;远远没有许多人想象的只是找出bug那么简单。准确的说&#xff0c;从一个项目立项以后&#xff0c;软件测试从业者…...

Python身份运算符

Python身份运算符身份运算符用于比较两个对象的存储单元运算符描述实例isis 是判断两个标识符是不是引用自一个对象x is y, 类似 id(x) id(y) , 如果引用的是同一个对象则返回 True&#xff0c;否则返回 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舆情监测工作计划有哪些?

舆情监测流程一般包括&#xff1a;数据收集、数据分析、信息汇报三个部分。首先&#xff0c;通过多种途径收集舆情数据&#xff0c;如网络媒体、社交媒体、博客、论坛等;其次&#xff0c;对收集的数据进行分析&#xff0c;统计舆情趋势、舆情类型等;最后&#xff0c;根据舆情分…...

Lombok使用总结

文章目录介绍Lombok原理常用注解DataGetterSetterToStringEqualsAndHashCodeNoArgsConstructorAllArgsConstructorRequiredArgsConstructorAccessors(chain true)遇到的问题谨慎使用Data问题总结Builder和Data不能共用解决介绍 官网&#xff1a;https://projectlombok.org/ …...

Qt 如何处理耗时的线程,不影响主线程响应 QApplication::processEvents)

事件原因&#xff1a; 前些时间遇到一个问题&#xff0c;在主线程接收子线程读的数据&#xff0c;一直接收不到&#xff0c;但放在子线程没有问题&#xff1b; 后面查了一下&#xff0c;因为接收子线程使用了 qApp->processEvents(); 查了一下 qApp->processEvents(); …...

Antd-table全选踩坑记录

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

防灾必看,边滑坡安全预警解决方案

一、行业背景在我国大部分地区经常会有雨季发生&#xff0c;大量的雨水渗透到了土壤内部&#xff0c;长时间饱含雨水的土壤会变得很重而且还会减少与下方岩石之间的摩擦力&#xff0c;顺着山坡这个滑梯滑下去&#xff0c;造成崩塌、滑坡、泥石流等地质灾害。地质灾害每年都是有…...

你每天所做的工作,让你产生了成就感吗?

我们是为了什么而工作&#xff1f;金钱&#xff1f;理想&#xff1f;生活&#xff1f; 似乎这一切都没有标准答案&#xff0c;你自己问你自己&#xff0c;问问你自己&#xff0c;每天踏入公司&#xff0c;坐到工位面前&#xff0c;你最真实的感受是什么&#xff1f; “成就感…...

MySQL中的锁

共享锁 共享锁也成为读锁&#xff0c;针对同一份数据&#xff0c;多个事务的读操作可以同时进行而不会互相影响&#xff0c;相互不阻塞的。 通过下面命令加共享锁 SELECT...LOCK IN SHARE MODE #或 SELECT...FOR SHARE;#(8.0新增语法)排他锁 排他锁也叫写锁&#xff0c;当一…...

WebView自定义进度条、加载动画,拿走直接用~

年前有个小需求&#xff0c;要对有些域名的H5进行加载流程优化&#xff0c;通过展示H5加载动画来安抚用户焦躁的心情&#xff0c;以提高用户体验。虽然不能理解加个动画咋就优化了用户体验&#xff0c;但需求还是得做的。想着这是个基础的小功能&#xff0c;独立性比较好&#…...

内存数据库Apache Derby、H2

概述 传统关系型数据库涉及大量的工作&#xff0c;如果想在Java应用程序里使用MySQL数据库&#xff0c;至少需要如下步骤&#xff1a; 安装&#xff08;可选&#xff1a;配置用户名密码&#xff09;建表&#xff08;要么从命令行进入&#xff0c;要么安装一个可视化工具&…...

麻省理工出版 | 2023年最新深度学习综述手册

UCL Simon Prince的新书&#xff1a;《Understanding Deep Learning》 &#xff0c;在2023年2月6日由MIT Press出版。他之前写过很受欢迎的《Computer Vision: Models, Learning, and Inference》。 关于这本最新的深度学习手册&#xff0c;作者这样介绍它&#xff1a; 正如书…...

vi命令详解

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 13 2020 16:04:38) 用法: vim [参数] [文件 …] 编辑指定的文件 或: vim [参数] - 从标准输入(stdin)读取文本 或: vim [参数] -t tag 编辑 tag 定义处的文件 或: vim [参数] -q [errorfile] 编辑第一个出错处的文件 参数:…...

抖音的外卖行业入局,为中小外卖企业创业者的机会给了哪些机会?

一则关于抖音进入外卖市场的消息&#xff0c;让美团“非常受伤”。 2月8日&#xff0c;美团(03690.HK&#xff09;盘中跌幅超9%。截至收盘&#xff0c;美团报收153.1港元&#xff0c;跌幅6.48%。美团大幅下跌的根源就是前一天关于抖音外卖进展的消息传闻。 2月7日&#xff0c…...

供应PEG试剂AC-PEG-COOH,Acrylate-PEG-Acid,丙烯酸酯-PEG-羧基

英文名称&#xff1a;AC-PEG-COOH&#xff0c;Acrylate-PEG-Acid 中文名称&#xff1a;丙烯酸酯-聚乙二醇-羧基 丙烯酸酯-PEG-COOH是一种含有丙烯酸酯和羧酸的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联剂。丙烯酸酯可与紫外光或自由基引发剂聚合。丙烯酸酯-PE…...

java二叉排序树

1.先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9)&#xff0c;要求能够高效的完成对数据的查询和添加 2.解决方案分析 使用数组 数组未排序&#xff0c; 优点&#xff1a;直接在数组尾添加&#xff0c;速度快。 缺点&#xff1a;查找速度慢. [示意图] 数组排序&#xf…...

聊一聊 gRPC 的四种通信模式

温馨提示&#xff1a;本文需要结合上一篇 gRPC 文章一起食用&#xff0c;否则可能看不懂。 前面一篇文章松哥和大家聊了 gRPC 的基本用法&#xff0c;今天我们再来稍微深入一点点&#xff0c;来看下 gRPC 中四种不同的通信模式。 gRPC 中四种不同的通信模式分别是&#xff1a;…...

梅州网站制作/网站设计报价方案

“云”概念在今年被炒得很热。不管什么会&#xff0c;如果没有“云”&#xff0c;都不好意思跟人打招呼&#xff1b;在IT圈子里&#xff0c;如果一个没有“云”的会议&#xff0c;那不叫“会”议&#xff0c;至少不是一个够档次的会。广告词不是说&#xff0c;“高度决定视野,角…...

视频网站视频预览怎么做的/优化网站的软件下载

前言 上一篇给大家介绍了Android Crash中的Java Crash分析&#xff0c;我们可以知道Java Crash一般会弹出提示框告诉我们程序崩溃了&#xff0c;通常使用Crash工具都能够捕获到&#xff1b;本篇博客来谈谈如何针对Native Crash进行分析&#xff0c;它相对与Java层面的Crash有什…...

便宜建站方法/深圳网络推广优化

题目标签&#xff1a;String 利用left&#xff0c; right 两个pointers&#xff0c; 从左右开始 互换 字母。如果遇到的不是字母&#xff0c;那么继续移动到下一个。 Java Solution: Runtime beats 29.87% 完成日期&#xff1a;12/08/2018 关键点&#xff1a;two pointers 1 c…...

做pc端网站适配/网站运营主要做什么工作

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;1&#xff0e; Kafka整体结构图Kafka名词解释…...

西安做网站程序/搜索引擎排名查询

Django模型Django 对各种数据库提供了很好的支持&#xff0c;包括&#xff1a;PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。 MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例…...

wordpress没有css样式表/百度游戏

您好&#xff0c;很高兴为您解答问题。您可以在提出问题之前先告诉我问题的主题&#xff0c;这样我就可以尽力为您提供最好的帮助了。...