对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);
                }
            }
        }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习(斋藤康毅)学习笔记(六)反向传播3

上一篇文章介绍了反向传播的自动化&#xff0c;但也存在一些问题&#xff0c;本章用于说明这些问题&#xff0c;并修改原有框架&#xff0c;使其支持复杂计算图的运行&#xff1a; 问题一&#xff1a;重复使用一个变量&#xff0c;梯度不会累计 也就是说&#xff0c;反向传播时…

3.6c语言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完数\n", j);}}return 0; }#de…

element-plus中table组件的使用

1、table组件的基本使用 注意&#xff1a; ①对象集合&#xff0c;要从后端查询。 ②prop是集合中的对象的属性名&#xff1b;label是表格表头的名称。 2、将性别一列的71转为男&#xff0c;72转为女 问题描述&#xff1a; 解决步骤&#xff1a; ①将el-table-column变成双标签…

.NET CAD 二次开发中的 Transform 与数学矩阵详解

.NET CAD 二次开发中的 Transform 与数学矩阵详解 一、Transform 的定义与作用 在 .NET CAD 二次开发中,Transform 是通过数学矩阵对图形实体进行几何变换的核心机制,包括平移、旋转、缩放、镜像和切变等操作。这些操作通过矩阵乘法实现,能够高效地修改图形的位置、方向和…

【js逆向】iwencai国内某金融网站实战

地址&#xff1a;aHR0cHM6Ly93d3cuaXdlbmNhaS5jb20vdW5pZmllZHdhcC9ob21lL2luZGV4 在搜索框中随便输入关键词 查看请求标头&#xff0c;请求头中有一个特殊的 Hexin-V,它是加密过的&#xff1b;响应数据包中全是明文。搞清楚Hexin-V的值是怎么生成的&#xff0c;这个值和cooki…

STM32之ADC

逐次逼近式ADC&#xff1a; 左边是8路输入通道&#xff0c;左下是地址锁存和译码&#xff0c;可将通道的地址锁存进ADDA&#xff0c;ADDB&#xff0c;ADDC类似38译码器的结构&#xff0c;ALE为锁存控制键&#xff0c;通道选择开关可控制选择单路或者多路通道&#xff0c;DAC为…

【Linux内核系列】:深入解析输出以及输入重定向

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz ★★★ 本文前置知识&#xff1a; 文件系统以及文件系统调用接口 用c语言简单实现一个shell外壳程序 内容回顾 那么在此前的学习中&#xff0c;我们对于Linux的文件系统已经有了…

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

无人机扩频技术对比!

一、技术原理与核心差异 FHSS&#xff08;跳频扩频&#xff09; 核心原理&#xff1a;通过伪随机序列控制载波频率在多个频点上快速跳变&#xff0c;收发双方需同步跳频序列。信号在某一时刻仅占用窄带频谱&#xff0c;但整体覆盖宽频带。 技术特点&#xff1a; 抗干扰…

项目实战--网页五子棋(对战功能)(9)

上期我们完成了websocket建立连接后的数据初始化&#xff0c;今天我们完成落子交互的具体代码&#xff1a; 这里我们先复习一下&#xff0c;之前约定好的落子请求与响应包含的字段&#xff1a; 1. 发送落子请求 我们在script.js文件中找到落子的相关方法&#xff0c;增加发送请…

elementplus的cascader级联选择器在懒加载且多选时的一些问题分析

1. 背景 在之前做的一个项目中使用到了element的级联选择器&#xff0c;并且是需要懒加载、多选、父子不关联等等&#xff0c;在选的时候当然没问题&#xff0c;但是回显的时候就会回显不出来&#xff0c;相信大部分伙伴都遇到过这个问题。我在以前出过一篇文章写过关于级联选…

基于PySide6的CATIA零件自动化着色工具开发实践

引言 在汽车及航空制造领域&#xff0c;CATIA作为核心的CAD设计软件&#xff0c;其二次开发能力对提升设计效率具有重要意义。本文介绍一种基于Python的CATIA零件着色工具开发方案&#xff0c;通过PySide6实现GUI交互&#xff0c;结合COM接口操作实现零件着色自动化。该方案成…

Uniapp项目运行到微信小程序、H5、APP等多个平台教程

摘要&#xff1a;Uniapp作为一款基于Vue.js的跨平台开发框架&#xff0c;支持“一次开发&#xff0c;多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台&#xff0c;并解析常见问题。 一、环境准备 在开始前&#xff0c;请确保已安装以下工具…

ROS分布式部署通信

目录 一、概念 二、设置 ROS 分布式网络 1. 环境要求 2. 主机&#xff08;Master&#xff09;设置 3. 从机&#xff08;节点设备&#xff09;设置 4. 测试是否正常通信 三、进阶启动多从机节点&#xff08;launch&#xff09;。 一、概念 ROS 分布式通信用于在多台计算机…

qt open3dAlpha重建

qt open3dAlpha重建 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionAlpha_triggered();//alpha重建 void MainWindow::

我的三维引擎独立开发之路:坚持与迷茫

今天终于解决了&#xff0c;之前开发的基于threeceisum开发的融合引擎Merge3D,引用threejs版本过低的问题&#xff0c;也算又前进了一步&#xff01; 有人说&#xff0c;直接用最新版本不就行了&#xff0c;哎关键之前版本怎么办哪&#xff0c;很多不兼容性&#xff0c;需要一个…

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…

数据分析人员需要掌握sql到什么程度?

学习SQL三个层次 熟悉基本的增删改查语句及函数&#xff0c;包括select、where、group by、having、order by、delete、insert、join、update等&#xff0c;可以做日常的取数或简单的分析&#xff08;该水平已经超过90%非IT同事&#xff09;;掌握并熟练使用高阶语法&#xff0…

简洁实用的3个免费wordpress主题

高端大气动态炫酷的免费企业官网wordpress主题 非常简洁的免费wordpress主题&#xff0c;安装简单、设置简单&#xff0c;几分钟就可以搭建好一个wordpress网站。 经典风格的免费wordpress主题 免费下载 https://www.fuyefa.com/wordpress

golang从入门到做牛马:第一篇-我与golang的缘分,go语言简介

还记得2018年的夏天,刚毕业的我不知道该做些什么,于是自学了一周的go语言,想要找一份go语言工作的代码,当时的go还没有go mod来管理依赖包,在北京找了一个月的工作,找到了一个小公司做了后端开发,当然使用go语言开发,带着兴奋劲,年轻身体也好,边努力学习,边工作。 时…