【数据结构】堆的建立 (时间复杂度计算-堆排序)---超细致

简介: 【数据结构】堆的建立 (时间复杂度计算-堆排序)---超细致

向上建堆:

向上调整的思想就是我们把原数组的第一个数据看成是一个堆 后续的数据是要插入的数据 然后利用这种思想使用我们之前写的 向上调整 函数

4e9ae54bab2c4ed1b2aa81f138c79932.png

这就是我们向上调整建堆的的时间复杂度的计算 大家看到这里是不是也会觉得 我们的向下调整建堆 也是这个时间复杂度呢 其实不是的 他们之间是有差别的  并且比较之下 向下调整建堆会更好一些  大家来看: 


向下建堆:

我们说过 向下建堆其实就是找到我们的最后一个非叶子节点 什么意思呢? 其实就是我们最后以个节点的父亲节点 我们从最后一个非叶子节点开始往上遍历每一个非叶子节点使用我们的向下调整函数  这样我们也就能保证我们使用向下调整函数的条件(该节点的左右子树都是堆且相同)

498cbd12cd9546cd8bf94c83d008550c.png所以我们的向下调整建堆的时间复杂度是O(N)

由此呢 我们得出 我们平常建堆得话还是使用 向下调整建堆 会好一点 虽说两者相差不多


堆排序:

我们刚刚了解了 向上建堆 和 向下建堆 的思想 现在就让我们运用这两种思想来实现我们的堆排序

现在假如我们要排一个升序 我们是要建大堆还是小堆呢?

  假设我们我们排的是小堆 那我们的思想就是排一个小堆 接着在第二个数据那里开始排小堆 这样的想法是没错的 但是有个问题大家有没有想过就是我们每一次建完堆 从根节点的下一个数据的位置建小堆的时候我们之前排的堆的结构是不是整体就被破坏了 又要重新地完完全全地建一次堆 如果这样的话我们是不是就要排 n^2(n-1+n-2....2+1) 次 这样我们还不如去一次次遍历找树来的简单  反正都是 n^2

36bcb48c56be4c54947b6167c267f58f.png所以我们要排升序的话 建大堆的效果会更好 这与这种方法的思路其实就是和我们前面写的HeapPop 堆删除 的思路是一样一样的 

e6406242e1e742fe88e7a3f814e52eb8.png大家看到我们的向下调整是可以控制数量的 所以呢我们每次排完只需要将根节点和最后一个叶子节点就是最后一个数据 进行一次交换

在下一次调整的时候 不把最后一个数据看在堆里面

我们上面不是说了如果排升序 建小堆的话 每次选数建堆 都要完完整整的建一次堆嘛  那我们的向下调整建堆需要 这样完全的建堆嘛?

当不是的哦:

8c70146847474aa597ef398fea43264c.png  不知道大家有没有想过如果我们排了一个数据后 以后还会遇到比他更大的嘛?

 当然答案是不会的啦 我们每次建堆都是大堆 我们把最大的换过去 留下的都是比他小的 而且我们在作向下调整建大堆的时候 我们也是要筛选左右孩子节点的 我们每次都是选出较大的换上去 这样我们既保证了 我们堆的结构没有破坏 同时内 换上来的数也是之前交换过最大的数的次小的数  


所以我们我们的堆排序 是不是就是一个选择排序呢? 后面的文章会说到

那堆排序的时间复杂度是不是就是 N*logN 呢?

:我们有N个数 每次排都是≈logN次

    while (end > 0)
    {
    swap(hp._a, hp._a + end);
    Adjustdown(hp._a, --end , 0);
  }


目录
相关文章
|
14天前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
29 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
16天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
58 16
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
26 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
68 1
|
1月前
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
70 0
数据结构与算法学习十八:堆排序
|
1月前
|
算法
[数据结构] -- 时间复杂度和空间复杂度
[数据结构] -- 时间复杂度和空间复杂度
15 0
|
1月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
1月前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
31 0
|
1月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
1月前
【数据结构】大根堆和小根堆
【数据结构】大根堆和小根堆
27 0