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

数据结构-堆排序问题

需要在数组里面进行排序,我们可以采取堆排序对其解决问题

版本1:

创建一个数组等大的堆,把数组里面的数值输入到堆里面进行堆排序,但是这样的弊端就是,不是顺序排序

版本2:

每次我们取堆顶然后打印,最后出堆,循环

弊端就是这样是时间复杂度我们发现还是o(n),没有必要那么麻烦半天时间复杂度还是这样

版本3:(推荐)

在数组上面进行排序,直接输出顺序排序

逻辑讲解

1,需要在数组里面进行排序,我们可以采取在数组建堆

2,然后交换收尾元素,每次调整的数值减少1

讲解逻辑

首先我们需要知道,

如果我们需要排序的是降序,我们就需要建立小堆

如果我们需要排序的是升序,我们就需要建立大堆

如果我们需要的是升序建立小堆的话

如果我们采取相反的方式的话,就会导致:(出现两个根)

首先n个数建小堆,固定第一个值是最小值
剩下的n-1个数再建堆
效率就很差了

如果相反的话,会导致根节点变化,从而导致逻辑混乱,数组里面的数值少的时候是不明显的,但是多的时候就不行了

逻辑实现图解

代码实现

//向下调整(大堆)
void AdjustDown(HPDataType* a, int n, int parent)
{int chile = parent * 2 + 1;//循环条件不能是父亲,不然会导致越界while (chile < n){//三个孩子进行比较if (chile + 1 < n && a[chile] < a[chile + 1]){chile++;}if (a[chile] > a[parent]){Swap(&a[chile], &a[parent]);parent = chile;chile = parent * 2 + 1;}else{break;}}
}
//堆排序数组内进行调整解决
void sort_test(int* a, int sz)
{//放出来的是小堆,所以我们只能排序降序,这样逻辑更融洽//建堆for (int i = 0; i < sz; i++){AdjustUp(a, i);}//交换排序 把首个元素和最后一个交换进行排序 每次--while (sz > 0){Swap(&a[0], &a[sz - 1]);AdjustDown(a, sz - 1, 0);sz--;}
}

这个 sort_test 函数实现了一个堆排序算法,它接收一个整数数组 a 和它的大小 sz

  1. 建堆:首先,函数通过调用 AdjustUp 函数来构建一个小顶堆(最小堆)。建堆过程是从最后一个非叶子节点开始向上调整,直到堆顶。

  2. 交换和排序:在建堆之后,函数进入一个循环,每次循环中,它将堆顶元素(当前堆中的最小元素)与当前堆的最后一个元素交换。然后,堆的大小减少 1,并且对剩余的堆进行向下调整以保持最小堆性质。

  3. 循环结束:循环继续进行,直到堆的大小减小到 0。最终,数组 a 将被排序为降序。

相关文章:

  • Android 按上/下键,焦点会移动到第一个控件上面或最后一个控件下面的解决办法
  • VirtualBox7.x下载安装CentOS7安装网络配置
  • AI盒子在智慧加油站的应用
  • 数据结构学习笔记
  • 代码随想录算法训练营第36期DAY45
  • 自然语言处理中的BERT模型深度剖析
  • 基于 Apache Doris 的实时/离线一体化架构,赋能中国联通 5G 全连接工厂解决方案
  • 31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)
  • c语言是编程软件还是编程语言?深入解析C语言的本质与定位
  • 【C语言】基于C语言实现的贪吃蛇游戏
  • 【VSCode】快捷方式log去掉分号
  • 修改ModelLink在RTX3090完成预训练、微调、推理、评估以及TRT-LLM转换、推理、性能测试
  • el-date-picker的使用,及解决切换type时面板样式错乱问题
  • 1.8k Star!RAGApp:在任何企业中使用 Agentic RAG 的最简单方法!
  • ADB日常使用命令
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Apache的80端口被占用以及访问时报错403
  • bearychat的java client
  • CSS相对定位
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6--对象的扩展
  • JAVA 学习IO流
  • JS笔记四:作用域、变量(函数)提升
  • Python学习之路16-使用API
  • SpringBoot 实战 (三) | 配置文件详解
  • 诡异!React stopPropagation失灵
  • 力扣(LeetCode)21
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端存储 - localStorage
  • 嵌入式文件系统
  • 设计模式 开闭原则
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 异常机制详解
  • 应用生命周期终极 DevOps 工具包
  • 最近的计划
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #DBA杂记1
  • #php的pecl工具#
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (4)STL算法之比较
  • (6)STL算法之转换
  • (7)STL算法之交换赋值
  • (c语言+数据结构链表)项目:贪吃蛇
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (超详细)语音信号处理之特征提取
  • (第27天)Oracle 数据泵转换分区表
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (回溯) LeetCode 77. 组合
  • (接口自动化)Python3操作MySQL数据库
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐