对堆排序有一个直观的理解吗?

2024-05-01

在学校,我们目前正在学习 Java 排序算法,我的作业是堆排序。我读了书,试图尽可能多地了解,但似乎我无法理解这个概念。

我并不是要求您为我编写一个 Java 程序,只要您能尽可能简单地向我解释堆排序的工作原理即可。


是的,所以基本上你拿一个堆并取出堆中的第一个节点 - 因为第一个节点保证是最大/最小,具体取决于排序方向。棘手的事情是首先重新平衡/创建堆。

我需要两个步骤来理解堆过程 - 首先将其视为一棵树,了解它,然后将该树转换为一个数组,以便它有用。

第二部分是首先遍历树的宽度,从左到右将每个元素添加到数组中。所以下面的树:

                                    73                          
                                 7      12          
                               2   4  9   10    
                             1          

将是 {73,7,12,2,4,9,10,1}

第一部分需要两个步骤:

  1. 确保每个节点都有两个子节点(除非您没有足够的节点来执行上面的树中的操作)。
  2. 确保每个节点都比其子节点大(或者如果首先对 min 进行排序则更小)。

因此,要堆化一列数字,您需要将每个数字添加到堆中,然后按顺序执行这两个步骤。

为了在上面创建我的堆,我将首先添加 10 - 这是唯一的节点,所以无需执行任何操作。 添加 12 作为其左侧的子项:

    10
  12

这满足 1,但不满足 2,所以我将它们交换:

    12
  10

添加 7 - 无事可做

    12
  10  7

Add 73

          12
       10     7
    73

10

          12
       73     7
    10

12

          73
       12     7
    10

添加 2 - 无事可做

          73
       12     7
    10   2

添加 4 - 无事可做

          73
       12     7
    10   2  4

Add 9

          73
       12     7
    10   2  4   9

7

          73
       12     9
    10   2  4   7

添加 1 - 无事可做

          73
       12     9
    10   2  4   7
  1

我们有我们的堆:D

现在,您只需从顶部删除每个元素,每次将最后一个元素交换到树的顶部,然后重新平衡树:

去掉 73 - 将 1 代替

          1
       12     9
    10   2  4   7

1

          12
        1    9
    10   2  4   7

1

          12
       10     9
     1   2  4   7

去掉 12 - 替换为 7

          7
       10     9
     1   2  4   

7

          10
       7     9
     1   2  4   

去掉 10 个 - 替换为 4 个

          4
       7     9
    1   2  

4

          7
       4     9
    1   2  

7

          9
       4     7
    1   2 

去掉 9 - 替换为 2

          2
       4     7
    1   

2

          4
       2     7
    1  

4

          7
       2     4
    1  

去掉 7 - 替换为 1

          1
       2     4

1

          4
       2     1

取 4 - 替换为 1

          1
       2

1

          2
       1

取 2 - 替换为 1

          1

Take 1

排序列表瞧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对堆排序有一个直观的理解吗? 的相关文章

  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • Java HashMap 嵌套泛型与通配符

    我正在尝试创建包含自定义类的不同子类的哈希集的哈希映射值的哈希映射 如下所示 HashMap
  • 无法将 INode 类型值分配给 类型变量。为什么?

    我想知道为什么以下代码无法工作 public static
  • 查找其索引的乘积可被另一个数字 X 整除的对的数​​量

    给定一个数组和某个值 X 找到满足以下条件的对的数量 i lt j a i a j and i j X 0 Array size lt 10 5 我想这个问题有一段时间了 但只能想出蛮力解决方案 通过检查所有对 这显然会超时 O N 2 t
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • java数学中的组合“N选择R”?

    java库中是否有内置方法可以为任何N R计算 N选择R 公式 实际上很容易计算N choose K甚至不需要计算阶乘 我们知道 公式为 N choose K is N N K K 因此 公式为 N choose K 1 is N N N
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • 如何构建和使用 TimeSeriesCollections

    我想在图表的 X 轴上显示一些日期 并且here https stackoverflow com questions 5118684 jfreechart histogram with dates据说我必须使用 TimeSeriesColl
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 从特定 JAR 文件读取资源(文件的重复路径)

    假设您有 jar1 和artifactId 动物园 jar2 和artifactId 动物 两个 jar 都有一个具有相同路径的资源文件 例如 animals animal txt 有什么方法可以从特定的 jar 中读取该文件吗 使用 ge
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 乔达时间中两个日期之间的天数

    如何找到两次之间的天数差异乔达时间 http www joda org joda time DateTime http www joda org joda time apidocs org joda time DateTime html实例
  • AES 密钥是随机的吗?

    AES 密钥可以通过此代码生成 KeyGenerator kgen KeyGenerator getInstance AES kgen init 128 but 如果我有一个 非常可靠 的生成随机数的方法 我可以这样使用它吗 SecureR
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles
  • 在矩阵/位图中查找质量簇

    这是此处发布的问题的延续 在 2D 位图上查找质心 https stackoverflow com questions 408358 finding the center of mass on a 2d bitmap正如给出的例子 它讨论了

随机推荐

  • 带有 Google App 脚本的 Google Sheets:如何在返回最终结果之前向单元格写入“状态”消息?

    我有一个函数可能需要一段时间才能返回输出 有没有办法让它在单元格中打印一条消息 然后稍后用输出覆盖该消息 该函数可能需要 30 秒才能运行 并且可能在 20 30 个单元格中使用 因此很高兴看到哪个单元格仍在计算以及哪个单元格已完成 fun
  • 在 R 中将多个回归表输出到 Word 文档的多个页面中

    我的目标是创建一个多页 Microsoft Word 文档 在连续页面上包含许多格式化回归表输出 理想情况下 这可以使用 R Markdown 来完成 我很幸运地使用Word在Word中制作了格式良好的回归表sjPlot tab model
  • Nhibernate ICriteria 和在查询中使用 Lambda 表达式

    你好 我是 NHibernate 的新手 我有点困惑 假设我们有一个product桌子 让product表有 2 列价格1 和价格2 然后我可以通过 HQL 查询映射的产品实体 如下所示 string queryString from pr
  • 5 位 mt_rand() 数字有多唯一?

    我只是想知道 如果你画出 5 位数字 mt rand 数字有多独特 在示例中 我尝试使用此函数获取 500 个随机数的列表 其中一些是重复的 http www php net manual en function mt rand php h
  • 每个 start_url 已抓取多少个项目

    我使用 scrapy 抓取 1000 个 url 并将抓取的项目存储在 mongodb 中 我想知道每个网址找到了多少个项目 从 scrapy 统计数据我可以看到 item scraped count 3500但是 我需要分别对每个 sta
  • 从 R 运行 powershell 命令:表达式或语句中出现意外标记

    我尝试了以下命令 在 powershell 窗口中有效 system powershell command Get ChildItem Filter html Where Object LastWriteTime ge 11 12 2021
  • 正则表达式 - 匹配包含 2 个或更多 2 个字母元音序列的单词

    我想知道如何匹配包含 2 个或更多 2 个字母元音序列的单词 使用 javascript 版本的正则表达式 例如 visionproof steamier preequip 我现在正在学习正则表达式 这就是我到目前为止所拥有的 它只匹配包含
  • 通过边框拖放调整 div 大小,无需添加额外的标记

    我有一个绝对定位的侧面板 我需要通过拖动此边框来更改其宽度 我还需要更改边框悬停上的光标 是否可以在不添加另一个 div 进行拖动的情况下做到这一点 这是标记 right panel position absolute border lef
  • C# Windows 应用程序中的文件上传

    在我的 C Windows 应用程序中 我想上传 pdf 文件 但在我的工具箱中找不到 FileUpload 控件 我如何在 C Windows 应用程序中上传 pdf 文件 regards 将 OpenFileDialog 控件放在窗体上
  • 在 ASP.net 中使用 NVP API 时 Paypal SetExpressCheckout 出现问题

    Hi 我正在实现 Facebook 游戏和 Paypal 快速结账支付服务之间的集成 我的网站是在 ASP net 中开发的 我使用 NVP API 进行集成 我的问题是我不断收到 10400 错误 订单总计丢失 我的代码是 Set the
  • 下载链接选项在显示标记中不起作用

    您好 我正在使用显示标签库显示表格 它工作正常 但是当我导出链接时 它遇到了麻烦 所以可以帮助我如何做到这一点 我的代码将是这样的
  • 如何在OpenAPI中引用响应组件?

    我正在为我的 API 编写 OpenAPI 定义 我在用components的响应 但当我尝试引用这些组件时 Swagger Editor 显示错误 responses ref components responses 401 ref co
  • SQL 查询中的外语/重音字符

    我正在使用 Java 和 Spring 的 JdbcTemplate 类在 Java 中构建一个 SQL 查询来查询 Postgres 数据库 但是 我在执行包含外来 重音字符的查询时遇到问题 例如 修剪后的 代码 JdbcTemplate
  • Apollo 无法在更新中访问 queryVariables:突变后

    我正在尝试使用 update 在执行突变后更新查询 问题是商店中的查询应用了多个不同的变量 我想更新查询并使用相同的变量返回它 我在文档中发现 updateQueries 有一个包含 queryVariables 的选项 它们是执行查询时使
  • Django 查询集权限

    我正在构建一个相当复杂的Django在电子邮件扫描服务之上使用的应用程序 这Django应用程序是使用 Python 3 5 编写的 该应用程序主要使用Django Rest Framework处理与浏览器前端的通信 我目前遇到的问题是我尝
  • AppDomain.CurrentDomain.GetAssemblies 失败并出现 ReflectionTypeLoadException

    在单元测试期间 我遇到了以下代码的问题 该代码要求所有加载的程序集 var res AppDomain CurrentDomain GetAssemblies SelectMany x gt x GetTypes ToList 此代码失败并
  • SAX:如何获取元素的内容

    我在理解使用 SAX 解析 XML 结构时遇到了一些困难 假设有以下 XML
  • grunt jasmine-node 测试运行两次

    我设置 grunt 来运行 node js 茉莉花测试 由于某种原因 使用此配置 结果总是显示双倍的测试 这是我的配置 我在用着茉莉花节点 https github com jasmine contrib grunt jasmine nod
  • strstr() 函数类似,忽略大小写

    我有两根弦 可以说 str1 One Two Three and str2 two 我想知道是否有任何函数可以检查第一个字符串中第二个字符串的匹配 并返回指向第一个字符串的指针 例如strstr 但它不会将相同的字母 大写或小写 视为两个不
  • 对堆排序有一个直观的理解吗?

    在学校 我们目前正在学习 Java 排序算法 我的作业是堆排序 我读了书 试图尽可能多地了解 但似乎我无法理解这个概念 我并不是要求您为我编写一个 Java 程序 只要您能尽可能简单地向我解释堆排序的工作原理即可 是的 所以基本上你拿一个堆