【堆】堆的数据结构,以及堆排序的优缺点、时间复杂度分析

news/2024/5/19 5:30:39 标签: 数据结构, 堆排序, , 时间复杂度

本来想写以及优先队列的,现在就只简单写写吧,先不写别的了,先把搞明白。

是什么

是一个 完全二叉树,每一个节点的值都必须 大于等于 或者 小于等于 其孩子节点的值。

的特点

插入时间复杂度:O(lgn)
删除时间复杂度:O(lgn)
获取最大值/最小值的 时间复杂度:O(1)

最大/最小

最大:每一个节点的值都必须 大于等于 其孩子节点的值。
最小:每一个节点的值都必须 小于等于 其孩子节点的值。
在这里插入图片描述

构建最大

构建最大的步骤分为一下几步:

  1. 把要插入的元素插入到
  2. 和父节点做比较
    2.1 如果比父节点大,则和父节点交换值,继续重复第二步
    2.2 如果比父节点小,则结束插入

现有一个数组 [5, 2, 9, 4, 6],将其构建成最大,构建过程如图所示
在这里插入图片描述

最大删除元素(删除顶元素)

总体分为两个操作,删除顶元素变换成最大

删除元素的详细步骤如下:

  1. 删除顶元素,取的最后一个元素放到
  2. 判断子节点是否大于当前节点值
    2.1 如果大于,选择两个字节点中较大的与当前节点交换,然后用交换的节点继续重复步骤2
    2.2 如果不大于,则删除结束,退出

因为我们构建的是最大,所以向外取元素时,只能取顶的元素。

在这里插入图片描述

排序>排序

排序>排序的核心思想,就是构建最大或最小,详细步骤如下:

  1. 构建最大
  2. 顶元素和最后一个未排序元素进行交换
  3. 重复1和2,直到最后一个元素位置

以数组 [1, 2, 9, 6, 4] 为例,进行排序>排序

  1. 把所有数据加入到
    在这里插入图片描述

  2. 未排序元素构建最大,然后把顶元素和未排序的最后一个元素交换
    构建最大
    在这里插入图片描述
    顶元素和未排序的最后一个元素交换
    在这里插入图片描述

  3. 排序第二个元素,重复步骤,未排序元素构建最大,然后把顶元素和未排序的最后一个元素交换
    构建最大
    在这里插入图片描述
    顶元素和未排序的最后一个元素交换
    在这里插入图片描述

  4. 排序第三个元素,重复步骤,未排序元素构建最大,然后把顶元素和未排序的最后一个元素交换
    构建最大
    在这里插入图片描述
    顶元素和未排序的最后一个元素交换
    在这里插入图片描述

  5. 排序第四个元素,重复步骤,未排序元素构建最大,然后把顶元素和未排序的最后一个元素交换
    构建最大
    在这里插入图片描述
    顶元素和未排序的最后一个元素交换
    在这里插入图片描述

  6. 剩下最后一个元素,无需排序,排序>排序结束
    在这里插入图片描述

排序>排序优点缺点(特点)

没有绝对的优缺点,想了想,只能叫排序>排序的特点

排序>排序的时间复杂度是O(nlgn),排序>排序的时间复杂度不是O(n2),因为采用了额外的空间,来降低了时间复杂度

不过,排序>排序有一个明显的问题,不管数组是否有序或者无序,都要从头到尾进行一遍排序,就好像是没有优化过的冒泡排序一样,从头冒到尾。

也因为这个问题,使得在数据量较少时,排序>排序的时间复杂度的常数比较高,进而倒是排序时间较长。

(一般来讲,时间复杂度是省略了常数k之后,因为在n足够大之后,k对n的影响较小,但是在n较小的时候,k的影响还是比较大的)


http://www.niftyadmin.cn/n/1684054.html

相关文章

对字符串操作的一些研究

首先,在CLR中所有的字符都被表示为16位的Unicode码值,所有的字符串都是由16位的Unicode码值组成。 16位的Unicode编码可以表示当今世界上的所有字符,所以,不必为字符的不同而担心保存的方式,这给字符的转换会很方便。…

使用java中的stream,嵌套list根据实体某个字段求和

嵌套list求和,如题 记录一下,搞了半天,积累一下,后续写stream整套的文章 for循环解决 int sum 0; for (EntityA entityA : list) {for (EntityB entityB : entityA.getEntityBList()) {sum entityB.getCount();} }用stream流…

【LeetCode】292. Nim 游戏 博弈论问题

文章是转载的,第一次遇见,记录一下 来自 https://leetcode-cn.com/problems/nim-game/solution/li-jie-bo-yi-wen-ti-zhong-bi-sheng-tai-he-bi-bai-t/ 刷题中常见的博弈问题,本质就是先手通过一系列操作,进来把当前状态变成对后手…

将java库转换为.net库

【转载请注明出处】 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />动机&#xff1a; 充分利用java阵营众多的类库 工具&#xff1a; IKVM――把java bytecode 转换成IL程序&#xff0c;并提供大部分J2SE 1.4类的.net实现&a…

Leetcode欠下的题,顺便整理一下经典题目

以此来记录力扣的题目&#xff0c;用来记录CV了但是不会做的题 &#x1f62d; &#x1f62d; &#x1f62d;还有各种类型的经典题目&#xff0c;总结在这里&#xff0c;在持续的哦~ 力扣周赛不会的题目 日期题目链接补没补上什么时候补上的2022年1月4日913. 猫和老鼠https://…

【python编程从入门到实践】python中的列表、字典基本使用

目录简述列表列表操作数值列表字典简述 主要记录学python列表的一些基础操作&#xff0c;这类应该应用会非常多&#xff0c;写算法也会用到&#xff0c;所以还是着重总结和记录一下这部分的内容 列表 列表操作 定义 cars [bow, audi, toyota, subaru]获取元素 正序&#…

【至此,2021年的一些碎碎念】结束是新的开始

2021的9月之前&#xff0c;丝毫回忆不起任何内容&#xff0c;换工作&#xff0c;换房子&#xff0c;真的想不起来任何东西&#xff0c;真正的决定还是从9月决定考研开始。 考研的开始。 22考研结束的时候&#xff0c;走出考场的时候我的心情&#xff0c;和脑子里面想的&#…

【左程云算法笔记】P1 认识复杂度、异或运算操作demo、插入排序算法

认识时间复杂度 int a arr[i]; 这是一个常数操作 int b linkedList.get(i); 这不是一个常数的操作&#xff0c;需要遍历&#xff0c;不能算第几个的目标地址&#xff0c;所以只能挨着个儿的找到下一个&#xff0c;然后从next找到下一个地址&#xff0c;然后跳到下一个目标地…