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

堆排序以及向上、向下调整算法的时间复杂度推导及实现(超详细)

什么是堆排序?

堆排序是由堆这种数据结构所设计的一种排序算法

堆的分类:

大根堆:每个父结点的值都大于子结点

小根堆 :每个父结点的值都小于子结点

 

在了解完堆之后,需要先了解建堆,建堆有向上建堆建大堆或者小堆,也有向下建堆建大堆或者小堆 

建大堆还是小堆看子结点和父结点的比较关系是大于还是小于

 向上调整算法

新数据插⼊到数组的尾上,再进行向上调整算法,直到满⾜堆。

• 先将元素插⼊到堆的末尾,即最后⼀个孩⼦之后 

• 插⼊之后如果堆的性质遭到破坏,将新插⼊结点顺着其双双亲往上调整到合适位置即可

void swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}//建大堆还是小堆将两个算法的第一个判断条件修改相反即可
//向上调整
void AdjustUp(HPDataType* arr,int child)
{int parent = (child - 1) / 2;//根据子结点求父结点while (child > 0)//直到子结点为根结点即循环停止{
//                     >if (arr[child] < arr[parent])//子结点小就交换,创建小堆{swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

 向上调整算法时间复杂度计算推导

第1层,2^0个结点,需要向上移动0层

第2层,2^1个结点,需要向上移动1层

第3层,2^2个结点,需要向上移动2层 

第4层,2^3个结点,需要向上移动3层

..............................................................

第h层,2^(h-1)个结点,需要向上移动h-1层

则需要移动结点总的移动步数为:每层结点个数  *  向上调整次数(第⼀层调整次数为0) 

由此可得:

向上调整算法建堆时间复杂度为:O(n ∗ log2 n)

因为堆是完全⼆叉树,⽽满⼆叉树也是完全⼆叉树,此处为了简化使⽤满⼆叉树来证明(时间复杂度本 来看的就是近似值,多⼏个结点不影响最终结果)

向下调整算法

堆的删除:

删除堆是删除堆顶的数据,将堆顶的数据根最后⼀个数据⼀换,然后删除数组最后⼀个数据,再进⾏向下调整算法。

• 将堆顶元素与堆中最后⼀个元素进⾏交换

• 删除堆中最后⼀个元素

• 将堆顶元素向下调整到满⾜堆特性为⽌  

//向下调整
void AdjustDown(HPDataType* arr, int parent, int n)
{int child = parent * 2 + 1;while (child < n){//小堆:找左右孩子中找最小的//大堆:找左右孩子中找大的
//                                      <if (child + 1 < n && arr[child] > arr[child + 1]){child++;}
//                     >if (arr[child] < arr[parent])  //小堆,什么时候交换? 孩子比父亲小{swap(&arr[child], &arr[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HPPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdjustDown(php->a, php->size, 0);
}

 向下调整算法时间复杂度计算推导

第1层,2^0个结点,需要向下移动h-1层 

第2层,2^1个结点,需要向下移动h-2层

第3层,2^2个结点,需要向下移动h-3层

第4层,2^3个结点,需要向下移动h-4层

......

第h-1层,2^(h−2)个结点,需要向下移动1层 

则需要移动结点总的移动步数为:每层结点个数  *  向下调整次数

向下调整算法建堆时间复杂度为:O(n) 

堆排序的应用

//堆排序
void HeapSort(int* arr, int n)
{//建堆//升序——大堆//降序——小堆//向上调整算法建堆//for (int i = 0; i < 6; i++)//{//	AdjustUp(arr, i);//}//向下调整算法建堆//for (int i = (n - 1- 1) / 2; i >= 0; i--)//{//	AdjustDown(arr, i, n);//}//循环将堆顶数据和最后一个数据进行交换int end = n - 1;while (end > 0){swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}
}

堆排序时间复杂度计算  

第1层,2^0个结点,交换到根结点后,需要向下 移动0层

第2层,2^1个结点,交换到根结点后,需要向下 移动1层

第3层,2^2个结点,交换到根结点后,需要向下 移动2层

第4层,2^3个结点,交换到根结点后,需要向下 移动3层

......

第h层,2^(h-1)个结点,交换到根结点后,需要向 下移动h-1层

 通过分析发现,堆排序第⼆个循环中的向下调整与建堆中的向上调整算法时间复杂度计算⼀致,此处 不再赘述。因此,堆排序的时间复杂度为O(n + n ∗ log n) ,即(n log n)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 五种创建springBoot项目的方法(本质上是三种)
  • FFmpeg学习
  • C语言从头学44——I/O 函数(一)
  • 软件测试生命周期、BUG描述与处理策略
  • leetcode面试算法题
  • Java程序员接单分享
  • Redis远程字典服务器(1)—— 初识Redis
  • SSH协议管理多主机(SSH协议的两种用法、生产环境用户初始化、结果返回值处理)
  • 人工智能算法工程师(高级)课程11-自然语言处理之NLP的语言模型-seq2seq模型,seq+注意力与代码详解
  • 【数据结构】链表篇
  • 深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告
  • 基于STM32的智能宠物喂食器
  • MySQL的索引事务和JDBC编程
  • QT(2.0)
  • Datawhale AI 夏令营(2024第三期)AI+逻辑推理方向 模型微调学习笔记
  • centos安装java运行环境jdk+tomcat
  • CSS居中完全指南——构建CSS居中决策树
  • Laravel Telescope:优雅的应用调试工具
  • MD5加密原理解析及OC版原理实现
  • Sequelize 中文文档 v4 - Getting started - 入门
  • supervisor 永不挂掉的进程 安装以及使用
  • 闭包,sync使用细节
  • 电商搜索引擎的架构设计和性能优化
  • 双管齐下,VMware的容器新战略
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微服务核心架构梳理
  • 小试R空间处理新库sf
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用Visual Studio开发以太坊智能合约
  • 正则学习笔记
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 仓管云——企业云erp功能有哪些?
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ###C语言程序设计-----C语言学习(3)#
  • $L^p$ 调和函数恒为零
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (55)MOS管专题--->(10)MOS管的封装
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (八)Flask之app.route装饰器函数的参数
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (计算机网络)物理层
  • (六)c52学习之旅-独立按键
  • (五)activiti-modeler 编辑器初步优化
  • (一)基于IDEA的JAVA基础1