问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

图解堆排序

发布网友 发布时间:2022-12-30 21:58

我来回答

1个回答

热心网友 时间:2023-10-31 18:02

在上一篇中我们一起使用二叉堆实现了优先级队列,假如我们从构建好的优先级队列中持续调用删除最小(或者最大),把结果输出到另一个数组中,那么就可以把数组的所有元素进行排序,这就是本篇我们需要学习的堆排序。在看本篇之前需要先看下前一篇《原来实现优先级队列如此简单》

堆排序的过程主要有两个阶段:

开始之前,我们需要把上一篇中的sink()方法修改一下;

保证我们在进行排序的时候直接使用原始的数组,无需建立一个辅助数组浪费空间;由于我们需要动态的缩小堆的大小,需要把size通过参数传入;

其次我们数组的下标是从0开始的,与之前的优先级排序有些差别,对于k节点的左边节点下标是2k+1,右边下标是2k+2

把一个输入的数组构建成一个堆有序,我们有两种方式:

例如:输入数组 a[]={8,3,6,1,4,7,2}

下沉是堆排序的第二个阶段,我们把最大元素删除,然后放入到堆缩小后数组中空出来的位置,当操作完成所有的元素之后,整个数组将会是有序的

下沉排序演示过程(图未完全画完):

文中所有源码已放入到了github仓库 https://github.com/silently9527/JavaCore

文中或许会存在或多或少的不足、错误之处,有建议或者意见也非常欢迎大家在评论交流。

最后,写作不易,请不要白嫖我哟,希望朋友们可以点赞评论关注三连,因为这些就是我分享的全部动力来源🙏

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
宋越熙宁战争战争经过 中越战争——宋朝篇(1) 吴江三里桥这边有会器乐的吗? 笛子品牌哪些较好 笛子什么品牌好 苏州寒山寺周围有售竹笛子吗 psp换装迷宫x 山东聊城有哪些小区 聊城为什么不向西建设 聊城民生广场是干什么的 高手帮忙看一下我的C++堆排序哪里错了??? 堆排序(二叉树) 电脑蓝屏之后360打不开了 美利达自行车怎么样 怎么登yy帐号? 我不知道怎么下载微信和yy该怎么办呢 森林最多几人联机 森林多人模式怎么被野人拖走 森林多人模式下打字发不出去 砂锅上粘上红糖水怎么清理啊? 原来的室友搬走了,是我自己的房子,但是另外那间卧室我平时也用不上,在58同城可以帮找到室友吗? 如何考教师资格证我在天津 iphone怎么设置字体大小 微信浮窗设置在哪设置 淘宝账号号怎么复制 苹果亮点在几分几秒 脆肉鲩怎么做好吃,水煮脆肉鲩的家常做法 请问puma有这件衣服吗 怎么做水煮鲩鱼 彪马串标这件衣服谁那有卖 我的c++堆排序 错误在哪 数学手抄报简笔画 数学精灵希里克是什么时候创造的 花呗7000逾期本地电话说要起诉我怎么办 支付宝打电话说要起诉请选地址是什么意思 四级准考证什么时候打印 四六级官网打印准考证时间 四级英语准考证打印时间 买1000元的理财产品万份收益是1.1那么一月能赚多少 蒋介石为什么吧杀张学良而吧杨虎城杀了 蒋介石临终遗言,道出不放过张学良的原因,宋美龄听后潸然泪下 芹菜煮不烂怎么办 芹菜叶在开水焯水不烂怎么回事 怎样汤芹菜能嚼得烂 用阿里旅行飞机票选座(海南航空) 阿里旅行19号下午的飞机什么时候可以选位 qq群签到送一百赞是真的吗 “两学一做”学习教育突出问题整改清单 掌中广视为什么打不开? 掌上华医苹果手机下载不了