| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构初阶之二叉树——堆排序 -> 正文阅读 |
|
[数据结构与算法]数据结构初阶之二叉树——堆排序 |
目录 一. 建堆建堆有两种方法,一种是采用向上调整法,另一种是采用向下调整法。 以下是两种方法的代码实现:
以上两种方法都可以进行建堆,但是他们的时间复杂度却是不一样的 可以通过以下方式证明: 如上图,最坏情况总的调整次数 = 每层数据个数 * 向上/下调整次数
从上图可以发现: 第一层有2^0个结点 第二层有2^1个结点 第三层有2^2个结点 第四层有2^3个结点 第n层有2^(h-1)个结点 那么,建堆的次数(交换的次数)最坏的情况就是,第二层要交换两次,第三层要交换8次...... 也就是说,向上调整的次数就会有: Tn = 2^1*1 + 2^2*2 + 2^3*3 + ... + 2^(h-1)*(h-1) 到这里会发现这是一个等比乘等差的求和,即采用错位相减法,两边同时乘以2,就会有 2Tn =?2^2*1 + 2^3*2 + ... + 2^(h-1)*(h-2) + 2^h*(h-1) 2Tn - Tn 以后就会有: Tn =? -2^1*1 - 2^2 - 2^3 - ... - 2^(h-1) + 2^h*(h-1) 把负号提出后就会变成: Tn =? -(2^1?+?2^2 +?2^3 +?... +?2^(h-1))+ 2^h*(h-1) 为了方便等比求和就减去一个1再加上一个1,就会变成: Tn =? -(2^0 + 2^1?+?2^2 +?2^3 +?... +?2^(h-1)) + 2^h*(h-1) + 1 前面等比求和以后就会变成: Tn = 1 - 2^h + 2^h*(h-1) + 1 而二叉树的全部结点的和N就是2^0 + 2^1 + ... + 2^(h-1),也是等比数列求和,求和以后就是: N = 2^h - 1 将该表达式代入Tn就会得到(N+1)(log2^(N+1)-1)+1,计算时间复杂度可以将常数去掉就变成了: N*logN 所以向上调整法的时间复杂度是O(N*logN)
这里使用向下调整法与以往不同的是需要从最后一个非叶子结点开始 因为使用向下调整法的前提是左右子树都必须是大堆或者小堆,否则无法使用,所以不再是从根结点开始调整,也就是从上图的第三层最后一个结点开始调整 从上图可以发现: 第一层有2^0个结点,需要向下调整h-1层 第二层有2^1个结点,需要向下调整h-2层 第三层有2^2个结点,需要向下调整h-3层 第四层有2^3个结点,需要向下调整h-4层 第h-1层有2^(h-1)个结点,需要向下调整1层 那么,建堆的次数(移动结点总的移动次数)最坏的情况就是,第一层要移动1*(h-1)步,第二层要移动2^1*(h-2)步,第三层要移动2^2*(h-3)步...... 也就是说,向下调整的步数就会有: Tn = 2^0*(h-1)?+ 2^1*(h-2)?+ 2^2*(h-3)?+ ... + 2^(h-2)*1 很明显,还是使用错位相减法,计算得出的最后结果是: Tn = N?- log(N+1) 时间复杂度是O(N) 通过计算发现向下调整法时间复杂度优于向上调整法 二. 利用堆删除思想进行排序建好堆以后就是排序,排序需要注意,如果我们是想要升序排序就需要建大堆,反之建小堆。如果不这样做,向上调整法无法用来排序,只能使用向下调整法排序,而向下调整法会将堆打乱,拿完一个数据后需要重新建堆,建堆的时间复杂度为O(N),导致时间复杂度变成O(N^2)。
以下是完整的一个堆排序代码,该排序采用的升序:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:54:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |