树结构的实际应用之堆排序

树结构的实际应用之堆排序
  • 基本介绍
    • 堆排序是利用堆这种数据结构设计而成的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度为O(logn),它也是不稳定排序。
    • 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。注意:没要求结点的左右孩子值的大小关系。
    • 每个结点的值都小于或者等于左右孩子结点的值,称为小顶堆。
    • 大顶堆举例说明
      大顶堆
    • 一般升序采用大顶堆,降序采用小顶堆
  • 堆排序基本思想
    • 将待排序序列构造成一个大顶堆
    • 此时,整个序列最大值就是根节点
    • 将其与末尾元素进行交换,将最大元素放到最后
    • 然后将剩余n-1个元素重新构造成一个堆,这样就会得到n个元素的次小值,如此反复执行,便能得到一个有序序列了。
  • 堆排序步骤说明
    • 步骤一:构造初始堆,将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。原始的数组**[4,6,8,5,9]**
      • 假设无序序列的结构:请添加图片描述
      • 此时,我们从最后一个非叶子结点开始,从右至左,从下到上调整。
        堆排序
      • 继续处理第二个非叶子结点
        请添加图片描述
      • 这时,交换导致了子树[4,5,6]结构不符合,继续调整
        请添加图片描述
      • 此时,我们就将一个无序序列构造成了一个大顶堆
    • 步骤二:将堆顶元素与末尾元素进行交换,使末尾元素最大,然后继续调整堆,再将堆顶元素与末尾元素交换得到第二大元素,如此反复进行交换、重建、交换。
  • 堆排序代码实现
// 要求给一个数组[4,6,8,5,9],要求使用堆排序算法,将数组升序排序
import java.util.Arrays;public class HeapSort {public static void main(String[] args) {int[] arr = {4,6,8,5,9};System.out.println("排序前");System.out.println(Arrays.toString(arr));System.out.println("排序后");heapSort(arr);System.out.println(Arrays.toString(arr));}/*** 堆排序* @param arr*/private static void heapSort(int[] arr) {int temp = 0;for(int i = arr.length / 2 - 1;i >= 0;i--) {adjustHeap(arr,i,arr.length);}// 将堆顶元素与末尾元素交换,将最大元素放到最后,重新调整结构,继续交换for(int j = arr.length - 1; j > 0;j--) {temp = arr[j];arr[j] = arr[0];arr[0] = temp;adjustHeap(arr,0,j);}}/*** 完成以i对应的非叶子结点的树调整成大顶堆*/public static void adjustHeap(int[] arr,int i,int length) {int temp = arr[i];for(int k = 2 * i + 1; k < length; k = 2 * k + 1) {// k中保存子节点中较大的值if(k + 1 < length && arr[k] < arr[k + 1]) {k++;}// 交换结点if(arr[k] > temp) {// 调整位置arr[i] = arr[k];i = k; // 保存最后要存放的位置的下标}else {break; // 已找到,退出循环}}arr[i] = temp;// 将值调整到适合位置}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用OBS Studio录制WAV音频,玩转语音克隆和文本转语音!

言简意赅的讲解OBS Studio解决的痛点 随着AI技术的快速发展&#xff0c;语音克隆与文本生成语音技术越来越受欢迎。无论你想要制作个人虚拟主播&#xff0c;还是给自媒体视频配音&#xff0c;拥有高质量的原始音频都是关键。本文详细教你使用免费且功能强大的软件——OBS Stud…

LangChain-5-agent

概述 Agent 是一种能够基于接收到的输入&#xff0c;利用自身的决策逻辑和可用的工具&#xff0c;动态地规划并执行一系列操作&#xff0c;以达成特定任务的程序或系统。它在与外界交互过程中&#xff0c;会根据实时情况灵活调整策略&#xff0c;而不是按照固定的预设流程执行…

操作系统进程与线程核心知识全览

本博客&#xff0c;根据王道所学。以下为第二章节知识点&#xff1a; 进程的概念、组成、状态与其转换、进程间通信、信号&#xff1b; 单/多线程模型、线程管理、调度时机的切换、调度的目标、调度算法、多处理机调度&#xff1b; 同步与互斥、进程互斥的软硬件实现方法、信号…

C++中类型转换操作符知识介绍

文章目录 **一、类型转换操作符的语法与定义****二、工作原理****三、示例&#xff1a;基本类型转换****四、示例&#xff1a;转换为自定义类型****五、与构造函数的对比****六、注意事项****七、应用场景****八、与 C 其他类型转换的关系****九、总结** 在C中&#xff0c;类型…

2048小游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…

TensorFlow深度学习实战——Transformer变体模型

TensorFlow深度学习实战——Transformer变体模型 0. 前言1. BERT2. GPT-23. GPT-34. Reformer5. BigBird6. Transformer-XL7. XLNet8. RoBERTa9. ALBERT10. StructBERT11. T5 和 MUM12. ELECTRA13. DeBERTa14. 进化 Transformer 和 MEENA15. LaMDA16. Switch Transformer17. RE…

还原自动驾驶的“前世今生”:用 Python 实现数据记录与回放系统

还原自动驾驶的“前世今生”:用 Python 实现数据记录与回放系统 你有没有想过这样一个场景: 一辆自动驾驶测试车,在街头拐了个弯,却突然急刹。测试员一脸懵,研发团队问:“数据记录了吗?” 他摊摊手:“系统当时没挂上录制……” 对不起,重测吧。 这不是段子,而是我在…

access和excel用vba进行辅助办公软件开发

1、access用vba创建子窗口child查询 出现这个报错的时候&#xff0c;一般是用vba通过ado.connection连接&#xff0c;没有绑定数据源造成的&#xff1a; 先绑定再使用 Me.Child2.SourceObject "表.资产管理" 连接数据源 Me.Child2.Form.RecordSource strSql …

Nginx+tomcat集群

Nginxtomcat集群 一、Nginx 简介 1.1 定义 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器&#xff0c;同时支持 IMAP/POP3/SMTP 服务。由俄罗斯工程师伊戈尔・赛索耶夫开发&#xff0c;于 2004 年首次公开发布&#xff0c;基于 BSD-like 协议&#xff0c;代码开源且免费…

RPC - 客户端注册和发现模块

registryMethod 函数详解&#xff1a; 函数目的 registryMethod 是 Provider 类的核心方法&#xff0c;用于向服务注册中心注册服务。注册成功后&#xff0c;服务注册中心会更新内部的服务映射表&#xff0c;建立服务名称到提供者地址的映射关系。 执行流程示例 场景: 多米…

leetcode332.重新安排行程:优先队列与DFS实现欧拉路径的行程规划

一、题目深度解析与行程规划本质 题目描述 给定一个机票的字符串二维数组 tickets&#xff0c;每个元素是 [from, to] 的形式&#xff0c;表示从 from 到 to 的机票。要求找出从 JFK 出发的行程&#xff0c;且必须使用所有机票&#xff0c;若存在多种可能的行程&#xff0c;返…

1.21SQLCipher 简介

SQLCipher 是一个基于 SQLite 的扩展&#xff0c;提供了透明的数据库加密功能。与普通 SQLite 不同&#xff0c;SQLCipher 在数据写入磁盘前自动加密&#xff0c;读取时自动解密&#xff0c;无需开发者手动处理加密逻辑。这使得它非常适合移动应用、桌面应用等需要本地数据加密…

无人机不再“盲飞”!用Python搞定实时目标识别与跟踪

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…

Vue-7-前端框架Vue之应用基础从Vue2语法到Vue3语法的演变

文章目录 1 基于vite创建1.1 对比webpack和vite1.2 创建工程1.3 启动项目2 调试工具Vue.js Devtools3 src结构3.1 index.html3.2 main.ts3.3 App.vue(根组件)4 示例(Vue2的语法)4.1 Person.vue4.2 App.vue4.3 选项式API对比组合式API4.4 程序流程5 示例(Vue3的语法)5.1 setup概…

上线iOSApp前抓包工具协作保障接口行为一致性(iOS抓包)

项目上线前&#xff0c;你是否总会担心“接口是不是在某个边缘条件下表现不一致”&#xff1f;哪怕单元测试通过、接口文档齐全&#xff0c;真到线上用户手上&#xff0c;总还是可能出现一些环境相关的异常。 最近参与某App大版本上线前的质量验证流程&#xff0c;我们特别安排…

Java可变参数:灵活编程的秘密武器

Java可变参数的理解与应用 Java中的可变参数&#xff08;Varargs&#xff09;允许方法接受数量不定的同类型参数&#xff0c;简化了方法调用时的参数传递。可变参数通过在参数类型后添加...实现&#xff0c;本质上是一个数组&#xff0c;但在调用时可以传入多个单独的参数。 …

汽车 CDC威胁分析与风险评估

汽车 CDC&#xff08;连续阻尼控制系统&#xff09;的威胁分析与风险评估需结合其技术特性、应用场景及行业标准展开。以下是详细解析及实例说明&#xff1a; 一、CDC 系统技术原理与结构 CDC&#xff08;Continuous Damping Control&#xff09;通过实时调节悬挂阻尼力提升驾…

TensorFlow 安装与 GPU 驱动兼容(h800)

环境说明TensorFlow 安装与 GPU 驱动兼容CUDA/H800 特殊注意事项PyCharm 和终端环境变量设置方法测试 GPU 是否可用的 Python 脚本 # 使用 TensorFlow 2.13 在 NVIDIA H800 上启用 GPU 加速完整指南在使用 TensorFlow 进行深度学习训练时&#xff0c;充分利用 GPU 能力至关重要…

Laravel 项目中图片上传后无法访问的问题

情况&#xff1a; Laravel 提供了 php artisan storage:link 命令&#xff0c;用于创建符号链接&#xff08;Symbolic Link&#xff09;&#xff0c;将 storage/app/public 映射到 public/storage。但是上传图片之后 文件目录确实有 但是无法访问。 1. 删除已经创建的 rm -rf…

Tesollo携人形机器人手进军国内市场

Tesollo灵巧手是Tesollo公司研发的一系列机器人灵巧手产品&#xff0c;涵盖两指到五指的设计 产品型号与特点 Delto-5F五指灵巧手&#xff1a;具备20个自由度&#xff0c;每个手指配备4个独立关节&#xff0c;抓握力达到7公斤&#xff0c;每个关节空载可达75转/分钟&#xff0…