对ArrayList中存储的TreeNode的排序回顾

一、背景导入

public void sort(List<TreeNode> list){TreeNode temp = null;for (int i=0; i<list.size()-1; i++){for (int j=0; j<list.size()-1-i; j++){if(list.get(j).freq > list.get(j+1).freq){temp=list.get(i);list.set(j,list.get(i+1));list.set(j+1,temp);}}}
}

这段代码的背景是我们通过哈夫曼树实现文件压缩的过程中遇到的一个会卡壳的地方,这里先大致描述一下这个小项目的背景:

我们创建一个.txt文本里面随机放一些随机数量a-z的字符,然后通过BufferReader和FileReader读取文件,我们统计每个字符出现的频率,字符和其对应的频率之间建立映射关系,通过一个hashmap来存储,然后我们需要通过遍历哈希表的同时新建节点来放置每一对键值对,最后创建一个动态数组arraylist来存储这些节点,然后再开始我们的建树过程,下一篇会详细对文件压缩的实现方法进行分析。

but,在建立哈夫曼树之前,如果我们对哈夫曼树的建树过程有一些了解,就会发现此时我们动态数组中虽然存储了节点,但是这些节点的数据大小是无序的不利于我们正常建树,所以这时候还需要我们单独封装一个排序方法,对节点的大小进行排序。

二、思路建立

这时候我们可以暂时使用冒泡排序来实现,在头脑中模拟一下排序的思路

首先从动态数组中下标为0的节点开始, 获取节点的频率,与下标为1的节点大小进行比较,如果[0]>[1]则两者大小交换位置...

感觉这样说有些抽象

三、代码举例

那我们就来举一个例子

待排序列表:

list = [5, 3, 8, 4, 2]

第一轮 (外部循环:i = 0)

//冒泡排序过程
第一轮 (i = 0)
//在第一轮中,我们需要比较整个列表(除了最后一个元素),所以 j 的范围是从 0 到 list.size() - 2,也//就是 0 到 3:
1. j = 0: 比较 5 和 3,5 > 3,交换:- 列表状态:[3, 5, 8, 4, 2]
2. j = 1: 比较 5 和 8,5 < 8,不交换:- 列表状态:[3, 5, 8, 4, 2]
3. j = 2: 比较 8 和 4,8 > 4,交换:- 列表状态:[3, 5, 4, 8, 2]
4. j = 3: 比较 8 和 2,8 > 2,交换:- 列表状态:[3, 5, 4, 2, 8]
//第一轮结束,最大元素 8 已正确“冒泡”到最后。

第一轮结束,最大元素 8 已正确“冒泡”到最后。

再思考一遍:外层循环控制次数,内层循环控制的是遍历列表的进度

当i=1时候,我们开始内部循环的第二次遍历,但其实由于最大数已经被正确冒泡到最后一位,所以此时待排序的只有4位数[3,5,4,2]

但不妨先把排序继续进行下去

//第二轮 (i = 1)
//在第二轮,j 的范围是从 0 到 list.size() - 3,也就是 0 到 2,因为最后一个元素已排序:
1. j = 0: 比较 3 和 5,3 < 5,不交换:- 列表状态:[3, 5, 4, 2, 8]
2. j = 1: 比较 5 和 4,5 > 4,交换:- 列表状态:[3, 4, 5, 2, 8]
3. j = 2: 比较 5 和 2,5 > 2,交换:- 列表状态:[3, 4, 2, 5, 8]
//第二轮结束,元素 5 已正确“冒泡”到倒数第二位。
//第三轮 (i = 2)
//在第三轮,j 的范围是从 0 到 list.size() - 4,也就是 0 到 1,因为最后两个元素已排序:
1. j = 0: 比较 3 和 4,3 < 4,不交换:- 列表状态:[3, 4, 2, 5, 8]
2. j = 1: 比较 4 和 2,4 > 2,交换:- 列表状态:[3, 2, 4, 5, 8]
//第三轮结束,元素 4 已正确“冒泡”到倒数第三位。
//第四轮 (i = 3)
//在第四轮中,j 的范围是从 0 到 list.size() - 5,也就是 0,只需比较一次,因为前三个位置已排序:
1. j = 0: 比较 3 和 2,3 > 2,交换:- 列表状态:[2, 3, 4, 5, 8]
//经过第四轮,列表已经完全排序。

四、代码分析与规律总结

随着外部循环变量i的大小每增加一次,内部循环进行一轮,最大数被冒泡至最后一位

假设这个列表的长度为len

当i=0时,j需要<(len-1)-0,循环结束,最大数冒泡至末位,待排序长度为len-1

当i=1时,j需要<(len-1)-1,循环结束,最大数冒泡至末位,待排序长度为len-2

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

当i=len-2时,j需要<(len-1)-(len-2),即j=0和j+1=1比较后,排序结束,所有数字此时已被正确排序。

注意正确使用get.与set.方法获取节点中的数据

public void sort(List<TreeNode> list){//思考泛型优化方式//冒泡排序//遍历节点,获得每个节点储存的的字符频率TreeNode temp = null;for (int i=0; i<list.size()-1; i++){for (int j=0; j<list.size()-1-i; j++){//-i可以理解为已被正确冒泡至末位的已排序个数(重要!!!)//相邻元素比较if(list.get(j).freq > list.get(j+1).freq){temp=list.get(i);//需要冒泡的数据list.set(j,list.get(i+1));//数据位置进行交换list.set(j+1,temp);}}}}

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

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

相关文章

Redis——快速入门

目录 Redis简介 安装配置(Windows) GUI工具RedisInsight的使用 十大数据类型&#xff08;5基本5高级&#xff09; 字符串String 列表List 集合Set(S) 有序集合SortedSet(Z) 哈希Hash(H) 发布订阅模式 消息队列Stream(X) 地理空间Geospatial(GEO) HyperLogLog(PF) …

MQ保证消息的顺序性

在消息队列&#xff08;MQ&#xff09;中保证消息的顺序性是一个常见的需求&#xff0c;尤其是在需要严格按顺序处理业务逻辑的场景&#xff08;例如&#xff1a;订单创建 → 支付 → 发货&#xff09;。 一、消息顺序性被破坏的原因 生产者异步/并行发送&#xff1a;消息可能…

SPI驱动(二) -- SPI驱动程序模型

文章目录 参考资料&#xff1a;一、SPI驱动重要数据结构1.1 SPI控制器数据结构1.2 SPI设备数据结构1.3 SPI驱动数据结构 二、SPI 驱动框架2.1 SPI控制器驱动程序2.2 SPI设备驱动程序 三、总结 参考资料&#xff1a; 内核头文件&#xff1a;include\linux\spi\spi.h 一、SPI驱…

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈&#xff0c;总结了一下主要以下几点&#xff1a; 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文&#xff0c;如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…

图解MOE大模型的7个核心问题并探讨DeepSeekMoE的专家机制创新

原文地址:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts #mermaid-svg-FU7YUSIfuXO6EVHa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FU7YUSIfuXO6EVHa .error-icon{fill…

windows电脑上安装llama-factory实现大模型微调

一、安装环境准备 这是官方给的llama-factory安装教程&#xff0c;安装 - LLaMA Factory&#xff0c;上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装&#xff0c;但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…

vscode+vue前端开发环境配置

目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后&#xff0c; npm config set registry https://registry.npmmirror.com# 安装vue相关工具&#xff0c;webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…

基于javaweb的SpringBoot田径运动会管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境&#xff1a;Uvicorn 直接驱动 作用&#xff1a;Uvicorn 作为 ASGI 服务器&#xff0c;原生支持 FastAPI 的异步特性&#xff0c;提供热重载&#xff08;--reload&#xff09;和高效异步请求处理。 启动命令&#xff1a; u…

Libgdx游戏开发系列教程(5)——碰撞反弹的简单实践

目录 水平滚动 水平滚动并反弹 四面滚动反弹 加个板子进行弹球 本篇简单以一个小球运动,一步步实现碰撞反弹的效果 本文代码示例以kotlin为主,且需要有一定的Libgdx入门基础 注:下面动态图片看着有些卡顿,是录制的问题,实际上运行时很流畅的 水平滚动 简单起见,我们通过S…

kan pinn

本文介绍了两种主要的 PINNs 结构&#xff0c;分别用于解决数据驱动的偏微分方程求解和数据驱动的偏微分方程发现问题。两种结构都采用了深度前馈神经网络&#xff0c;并使用了双曲正切激活函数。 1. 连续时间模型&#xff1a; 用于数据驱动求解&#xff1a; 包含两个神经网络…

【C++】vector(上):vector的常用接口介绍

文章目录 前言一、vector的介绍二、vector的常用接口介绍1.vector类对象的常见构造2.vector iterator 的使用3.vector类对象的容量操作3.1 size、capacity 和 empty的使用3.2 reserve的使用3.3 resize的使用 4.vector类对象的访问&#xff08;包含data&#xff1a;返回底层数组…

【大模型】Llama 3.2 大语言模型初探:模型权重下载

文章目录 一、简介二、权重下载2.1 方法一&#xff1a;Meta 官网申请下载2.2 方法二&#xff1a;使用 hugging face 下载 一、简介 Llama&#xff08;Large Language Model Meta AI&#xff09;是 Meta&#xff08;原 Facebook&#xff09;开发的一系列开源大型语言模型。它的目…

python量化交易——金融数据管理最佳实践——使用qteasy大批量自动拉取金融数据

文章目录 使用数据获取渠道自动填充数据QTEASY数据拉取功能数据拉取接口refill_data_source()数据拉取API的功能特性多渠道拉取数据实现下载流量控制实现错误重试日志记录其他功能 qteasy是一个功能全面且易用的量化交易策略框架&#xff0c; Github地址在这里。使用它&#x…

基于SpringBoot的在线骑行网站的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…

Harbor端口更改||Harbor端口映射

Harbor端口更改|Harbor端口映射 目标&#xff1a;将端口更改为8930 前言 [rootk8s-node1 harbor]# ls common common.sh docker-compose.yml harbor.v2.5.0.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare如上是Harbor的文件目录 更改harbor.yml文件…

飞算JavaAI编程工具集成到idea中

AI插件介绍 飞算AI的插件下载地址&#xff0c;里边也有安装步骤&#xff1a; JavaAI 以上图是不是看着很牛的样子&#xff0c;一下成为高手确实说的太夸张了点&#xff0c; 一键生成后端JavaWeb项目还是挺方便的。 飞算JavaAI插件安装 Idea->>file->>setting-&…

51c自动驾驶~合集53

我自己的原文哦~ https://blog.51cto.com/whaosoft/13431196 #DriveTransformer 上交提出&#xff1a;以Decoder为核心的大一统架构写在前面 & 笔者的个人理解 当前端到端自动驾驶架构的串行设计导致训练稳定性问题&#xff0c;而且高度依赖于BEV&#xff0c;严重限…

Pytorch系列教程:模型训练的基本要点

PyTorch是一个开源的机器学习库&#xff0c;由于其灵活性和动态计算图而迅速流行起来。在PyTorch中训练模型是任何数据科学家或机器学习工程师的基本技能。本文将指导您完成使用PyTorch训练模型所需的基本步骤。 总体说明 模型训练流程主要包括数据准备、网络构建、优化配置及…