二叉排序树与文件操作的设计与实现_堆排序就这么简单

一、堆排序介绍

来源百度百科:

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树

前面我已经有二叉树入门的文章了,当时讲解的是二叉查找树,那上面所说的完全二叉树是怎么样的一种二叉树呢??还有满二叉树又是怎么的一种二叉树呢??甚至还有完满二叉树??

  • 完全二叉树: 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐
  • 满二叉树:除了叶子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充
  • 完满二叉树:除了叶子结点之外的每一个结点都有两个孩子结点。

下面用图来说话:

  • 完全二叉树(Complete Binary Tree):

d27e8e1c9cc6ae1176ffcdf16c04f714.png
  • 满二叉树(Perfect Binary Tree):

2440b9b63ccd89943a31b56350cef38f.png
  • 完满二叉树(Full Binary Tree):

03a97f59c9bb95d8205fd8e593ee3be5.png

参考资料:

  • www.cnblogs.com/idorax/p/64…

简单来说:堆排序是将数据看成是完全二叉树、根据完全二叉树的特性来进行排序的一种算法

  • 最大堆要求节点的元素都要不小于其孩子,最小堆要求节点元素都不大于其左右孩子
  • 那么处于最大堆的根节点的元素一定是这个堆中的最大值

这里我们讨论最大堆:当前每个父节点都大于子节点

c2cb63febc5b66ac937e45342f1b9447.png

完全二叉树有个特性:左边子节点位置 = 当前父节点的两倍 + 1右边子节点位置 = 当前父节点的两倍 + 2

1d4de1215853be762e6e18d2a57f692f.png

二、堆排序体验

现在我们有一个完全二叉树:左子树和右子树都符合最大堆-->父>子

5b863d7fb7edfb3a4969e5c486254354.png

但是我们会发现:根元素所在的数并不符合,明显的是:1是小于7的

d50005af03c014bc1eac1e62d07b9431.png

我们就对其进行交换,交换完之后我们会发现:右子树又不符合了

因为,右子树变成了这样:

1ac1d77d2286d276cde0402c02f70b6f.png

最后,我们将右子数的最大值也交换到右子树的根元素上

475fe3fb8b4d3426cefbb8059142398c.png

于是我们第一次的建堆操作就完成了!

b767e949a354c9df39c26d50715e8e45.png

可以发现的是:一次堆建立完之后,我们的最大值就在了堆的根节点上

随后将堆顶最大值和数组最后的元素进行替换,我们就完成了一趟排序了。

d5a0da7af98e9d525a48cdc14bcb8f38.png

接下来,剩下的数不断进行建堆,交换就可以完成我们的堆排序了

fae99c1848da0a16c9c4e3780427cd9a.png

.........建堆,交换....建堆,交换...建堆,交换...建堆,交换..

三、堆排序代码实现

比较当前父节点是否大于子节点,如果大于就交换,直到一趟建堆完成

/*** 建堆** @param arrays          看作是完全二叉树* @param currentRootNode 当前父节点位置* @param size            节点总数*/public static void heapify(int[] arrays, int currentRootNode, int size) {if (currentRootNode < size) {//左子树和右字数的位置int left = 2 * currentRootNode + 1;int right = 2 * currentRootNode + 2;//把当前父节点位置看成是最大的int max = currentRootNode;if (left < size) {//如果比当前根元素要大,记录它的位置if (arrays[max] < arrays[left]) {max = left;}}if (right < size) {//如果比当前根元素要大,记录它的位置if (arrays[max] < arrays[right]) {max = right;}}//如果最大的不是根元素位置,那么就交换if (max != currentRootNode) {int temp = arrays[max];arrays[max] = arrays[currentRootNode];arrays[currentRootNode] = temp;//继续比较,直到完成一次建堆heapify(arrays, max, size);}}}

值得注意的是:在上面体验堆排序时,我们是左子树和右子数都是已经有父>子这么一个条件的了

  • 显然,一个普通的数组并不能有这种条件(父>子),因此,我们往往是从数组最后一个元素来进行建堆
/*** 完成一次建堆,最大值在堆的顶部(根节点)*/public static void maxHeapify(int[] arrays, int size) {// 从数组的尾部开始,直到第一个元素(角标为0)for (int i = size - 1; i >= 0; i--) {heapify(arrays, i, size);}}

完成第一次建堆之后,我们会发现最大值会在数组的首位:

add949eaafaab91190fe098e093f2113.png

接下来不断建堆,然后让数组最后一位与当前堆顶(数组第一位)进行交换即可排序:

for (int i = 0; i < arrays.length; i++) {//每次建堆就可以排除一个元素了maxHeapify(arrays, arrays.length - i);//交换int temp = arrays[0];arrays[0] = arrays[(arrays.length - 1) - i];arrays[(arrays.length - 1) - i] = temp;}

a701efff46f8d96de247adf436e172da.png

四、总结

堆排序是比其他排序要难一点,他用到了完全二叉树这么一个特性来进行排序,代码实现上也比其他排序要复杂一点。

参考资料:

  • www.cnblogs.com/skywang1234…
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

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

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

相关文章

extjs 前端js代码调用后台函数方法

前端javascript代码部分&#xff1a; Ext.Ajax.request( { url: /Process/SuspendWorkFlow, //配置的后台函数路由 params: { wfInsId: wf.WFInstanceID, status: cmd }, //对应函数的参数 success: function () { LaunchedWFGrid.store.reload(); Ext.Msg.show({ title: &qu…

linux卸载android studio,mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案

如果你是mac ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在.废话不多说,复制粘贴就是干!!!!~~~~~~~~第一步: 复制粘贴就是干!!!!~~~~~~~~ 复制到命令行里面,直接回车就OKrm -Rf /Applications/Android\ Studi…

Tp框架如何使用事务和锁,还有查询缓存

1.事务 在ThinkPHP框架中&#xff0c;可以使用think\db\Transaction类来实现事务。 use think\Db; use think\db\Transaction;// 开始事务 Db::startTrans();try {// 执行数据库操作Db::table(user)->where(id, 1)->update([name > John]);// 提交事务Db::commit(); }…

因为没钱买衣服,我女朋友不要我了......

1 我妈为了省钱啥事都做得出▼2 高端的黄牛总是用最朴素的方法▼3 不加点什么你们觉得我阴阳怪气祖安大师怎么办&#xff1f;▼4 一天共有86400秒一天写2000首诗&#xff0c;也就是平均43.2秒一首曹植七步成诗也不过如此了▼5 如果在猫顺毛时弄乱它的毛会怎么样&#xff1…

Tech UP——EGO北京分会成立啦

古人崇敬自然&#xff0c;认为天地生万物而四时有序&#xff0c;是以春耕、夏耘、秋收、冬藏。在过去的8年里&#xff0c;InfoQ中国秉持着“促进软件开发领域知识与创新的传播”的理念&#xff0c;始终与技术人和公司在一起。经过8年的耕耘和沉淀&#xff0c;正是给大家呈现一些…

python基金会主席入门教程_Python基金会-文件IO操作,python,基础

函数功能open打开文件read读取文件write写文件close关闭文件readline行读取readlines多行读取open方法open方法&#xff1a;打开一个文件&#xff0c;返回一个文件对象(流对象)和文件描述符&#xff0c;打开文件失败则抛异常三步曲&#xff1a;创建文件&#xff0c;打开文件&am…

Sys.WebForms.PageRequestManagerTimeoutException:服务器请求超时

Sys.WebForms.PageRequestManagerTimeoutException:服务器请求超时 在页面上使用Ajax技术时&#xff0c;当页面的程序持续时间较长时&#xff0c;程序突然会中断&#xff0c;出现上述错误&#xff0c;最后查阅资料发现ScriptManager的AsyncPostBackTimeout异步请求是有时间限制…

实现一个登录:Mac+.NET 5+Identity+JWT+VS Code

.NET圈儿的朋友们&#xff0c;大家好&#xff01;我可太喜欢如今开源的.Net了&#xff0c;写代码很巴适&#xff01;所以今天分享一下之前学习的一个登录小案例&#xff0c;代码有不足之处欢迎指正&#xff01;&#xff01;&#xff01;工具&#xff1a;采用VS Code及其插件开发…

linux e514写入错误,Linux上使用vim编辑文件保存时报错:E514: write error (file system full?)...

今天在Linux上使用vim编辑文件保存时报如下错误E514: write error (file system full?)从错误看&#xff0c;是磁盘满了&#xff0c;于是使用df -hl查看磁盘使用情况$ sudo df -hlFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_myserver-lv_root 50G 43G 4.6G 91…

天体运行动图,如此美妙,如此震撼!

全世界只有3.14 % 的人关注了爆炸吧知识三体中心天体也在运动双星系统银河系与仙女系相撞模拟转自&#xff1a;奇趣物理--完--

链接链接新手变化需要注意哪些问题

昨天“新手高速早期排名提升的关键因素 ”seo文章中提到不包含在预。没有排名&#xff0c;没有交通情况只有通过链接重量提升&#xff0c;不过&#xff0c;昨天的帖子时&#xff0c;有一个提为好友。除非你是一个人或资源非常丰富的静脉。情链接也不是非常好换&#xff1f;相信…

[转载]工作面试时最难的25个问题

原文地址&#xff1a;工作面试时最难的25个问题作者&#xff1a;zcan准备是成功的一半 如果你是一个对目前的职位不满意&#xff0c;正着手去在新的一年里找到一个新的职位&#xff0c;这篇文章就是你的一个帮手。工作面试是你去面对未来的老板的征途中最重要的一个过程。你必须…

ASA 第五天实验

Failover的需求 • 相同的型号和硬件配置&#xff08;接口数量和模块&#xff09; • 相同的软件版本* • 相同的加密特性&#xff08;DES or 3DES&#xff09; • 相同大小的flash和RAM* 一、配置StatefulAS Lan-based FO 步骤一、 hostname ASA interface Ethernet0/0 nameif…

密封槽设计标准_哈尔滨轴承 | 超全面机械密封选型

有转动的地方&#xff0c;就有HRB轴承(400-086-6629)100多年来&#xff0c;人们采用填料一类的多种密封材料&#xff0c;使液体从液泵壳体沿着主轴的向外泄漏量不断减少。尽管现代工艺流程中采用的液泵&#xff0c;仍然广泛地沿用最古老的密封设计——填料盒&#xff0c;因为其…

linux+awk忽略tab符号,awk 如何避免文本中出现特殊符号的影响?

纯 awk 的解决方案&#xff0c;parse_csv 函数通过第一个返回一个 awk 数组&#xff0c;包含分隔好的 CSV 字段&#xff0c;直接用下标取值使用就可以了。注意&#xff0c;awk 的数组下标从 1 开始。# parse csv files to an awk array.awk -F, {parse_csv(r);# replace follow…

重要更新,Office Add-in将全面支持Webview2

在陪娃上课&#xff0c;耳边回响着美妙的音乐&#xff0c;打开电脑码字&#xff0c;给大家分享一个非常重要的消息&#xff1a;Office Add-in将全面支持WebView2了。Office的开发爱好者可能会对此很感兴趣&#xff0c;虽然新一代的Web Add-in随着Office 365的推出&#xff0c;也…

哈佛学者:这3本英文名著,每天小读10分钟,英语level暴涨....

全世界只有3.14 % 的人关注了爆炸吧知识《锵锵》中窦文涛曾说过&#xff1a;“读原著学英语&#xff0c;就像有了可视化进度条&#xff0c;每天的提升肉眼可见。”今天就给大家推荐3本豆瓣高分英文名著&#xff0c;学英语不枯燥&#xff0c;每天小读10分钟&#xff0c;即可学到…

Oracle下SQL基本操作(二)

----------------------------建表&#xff0c;与插入数据 --创建职务表 CREATE TABLE POSITION( POSITIONID VARCHAR2(2), POSITIONNAME VARCHAR2(20), CONSTRAINTS POS_ID_PK PRIMARY KEY (POSITIONID) ); --创建工资级别表 CREATE TABLE EMPLEVEL( LEVELNO VARCHAR2…

php -- 用文本来存储内容,file_put_contents,serialize,unserialize

根据存储的内容来划分 字符串&#xff1a; file_put_contents &#xff1a;将一个字符串写入文件 语法&#xff1a;int file_put_contents ( string $filename , mixed $data [, int $flags 0 [, resource$context ]] ) 参数 filename&#xff1a;要被写入数据的文件名。 data…

python入门html_python-html入门

网页三剑客&#xff1a;HTML、CSS、JS上网就是下载网页&#xff0c;web页面是浏览器的执行结果&#xff0c;浏览器是代码解释器超文本&#xff1a;指页面内容可以包含图片、链接、音乐、程序等非文本元素。标签语言特点&#xff1a;简单<>标签属性&#xff1a;1)键值对2)…