【算法与数据结构】图说堆排序
1、堆 一棵完全二叉树
大顶堆:所有非叶子节点元素均不小于其左右子树根节点的值
小顶堆:所有非叶子节点元素均不大于其左右子树根节点的值
2、 初始化堆
①一组无序元素R[0, 1, ..., n - 1], 先按照顺序将该组无序元素构造为一棵完全二叉树
②从该二叉树的第一个非叶子结点开始调整,然后调整前一个结点(一定是非叶子结点),依次直到调整完根节点
③上一步一遍完成后,再来一遍,直到该完全二叉树符合一个堆的定义为止
测试数据:R[] = {16, 7, 3, 20, 17, 8}, 本组测试数据中,最后一个非叶子结点为值为3的点
3、调整堆
第二步完成后,二叉树符合一个堆的定义,如下图
步骤:
将符合堆定义的上图中最后一个元素 与 堆顶元素互换, 此时集合 { R[n - 1] }有序, 剩下的无序序列为{ R[0, ..., n - 2] }
互换后,如果堆顶元素不符合堆的定义,则对齐进行调整:此父结点 与 左右子树根节点中 大的那个 互换, 再调整其他不符合堆定义的元素
当{ R[0, ..., n - 2] }中元素都符合堆定义的时候,将最后一个元素(即 R[n - 2])与堆顶元素互换, 此时 集合{ R[n - 2], R[n - 1] }有序,
重复上述过程
具体如下
①将二叉树的最后一个结点(图中值为3的点) 与 堆顶元素 互换位置, 此时 集合 {20}有序
② 堆顶元素3不符合堆定义,调整
③此时元素3 不符合堆定义, 调整
④二叉树满足堆的定义后,将无序序列中最后一个元素(这里应该是值为3的元素) 与 堆顶元素 互换
⑤此时的有序序列为 {17, 20}, 此时堆顶元素3不满足堆定义,调整
⑥此时 元素3 不满足堆定义,调整
⑦此时除有序序列{17, 20}以外,其余元素满足堆定义, 将无序序列中最后一个结点(这里是值为3的元素) 与 堆顶元素 互换
⑧此时 有序序列为{16, 17, 20}, 堆顶元素3不满足堆定义, 调整
⑨此时除有序序列{16, 17, 20}以外,剩余无序序列满足堆定义, 将无序序列中最后一个元素(值为3的元素) 与 堆顶元素 互换
⑩此时有序序列为 {8, 16,17, 20}, 堆顶元素3不满足堆定义, 调整
⑾此时除有序序列{8, 16, 17, 20}以外, 剩余元素满足堆定义, 将无序序列中最后一个元素(值为3的元素) 与 堆顶 互换
⑿此时有序序列为{7, 8, 16, 17, 20}, 无序序列中只剩一个元素, 调整完毕,如下
完毕。
参考文献:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html 感谢作者
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗