【算法与数据结构】图说堆排序

 

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  感谢作者

 

posted on   崔好好  阅读(336)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示