堆排序

目录

  • 一、定义
  • 二、算法分析
  • 三、代码地址

一、定义

1.1 堆

​ 此处的堆,指数据结构中的堆。而不是内存中的那种内存堆,内存堆是基于数据结构的一种实现。堆的数据结构是一棵完全二叉树,它有如下特点:(具体参考下文链接)

  • 堆是一棵完全二叉树
  • 它总是最小值在根节点(或最大值在根节点)
  • 它上一层比下一层小(大)
  • 必定有快速删除根节点,并返回根节点元素的方法
  • 在删除根节点(最小元或者最大元)之后,自动调节使之依然保持堆结构。
  • 插入节点依然保持堆结构

​ 综上,堆结构的基本操作是插入删除根节点,在操作过程中还会保持堆结构不会被破坏。所以我们可以用堆排序,我们可以通过删除根节点得到最小值,再删除根节点,得到第二小值,如此类推,只要一直取根节点,就能得到从小到大的序列。

堆的数据结构:https://www.cnblogs.com/dhcao/p/10591282.html

1.2 堆排序

​ 对一个含有N个元素的数组a,我们利用堆排序的做法:

  • 首先建立一个二叉堆(最小元在根节点)。根据二叉堆的特性,此过程运行时间\(O(N)\)
  • 然后执行\(N\)次删除最小元(deleteMin)操作,按照顺序,最小的元素先离开堆。
  • 将这些元素记录到第二个数组中,得到一个排序之后的数组(可避免使用第二个数组)。
  • 再将这些数组拷贝回来,得到\(N\)个元素的排序。

图解
1328967-20190415223455461-2133887454.png

图解描述

​ 我们对数组a进行堆排序,采用根节点存放最大值(最大最小都一样)并且避免使用第二个数组。

  • 构建一个Max堆,最大值在根节点,父节点必定比子节点大。
  • deleteMax,堆缩小1。
  • 将刚刚删除的元素放在空出来的位置。
  • 依次类推,我们借助二叉堆一个重要的特性:删除时,总是空出最后一个元素。这是为了保持它是一个完全二叉树。
    1328967-20190415223515060-1656070338.png

以上做法,我们避免使用第二个数组,而是直接在第一个数组中构建一个堆。然后将堆排序!

二、算法分析

​ 堆排序耗费的时间可以分为2个部分。第一阶段构建堆,第二阶段是循环删除根元素(deleteMax)。

​ 第一阶段:从堆的性质我们可以知道,构建N个元素的堆,需要2N次比较。(这是因为堆的性质是父节点大于子节点,所以要选出父节点,需要根左右子节点相互比较)

​ 第二阶段:循环deleteMax。第\(i\)次deleteMax最多用到\(2\lfloor logi \rfloor\)次比较,这个时间来自于堆的deleteMax时间分析,删除最大值之后,我们需要重新构建堆,那么就需要最后一个位置放入根节点所在的空穴(根节点作为最大值已经被删除,只剩下空穴一个)中,然后采用下沉的方式,将它放到合适的位置,重新构建堆只需要满足父节点大于子节点,所以下沉过程只需要根左子节点和右子节点比较,而二叉树的高是\(logN\)

​ 所以总时间是:
\[ 第二阶段+第一阶段时间 \\ 2(\sum_{i=1}^{N}logi )+2N\\ =2(log1+log2+···+logN)+2N\\ =2(log(1*2*3*···*N))+2N\\ =2(logN!)+2N\\ =2(log(\sqrt{2\pi N}\frac{N^N}{e^N})+2N\\ =2(\frac{1}{2}log(2\pi)+\frac{1}{2}logN + NlogN -Nloge)+2N \\ =O(2NlogN-O(N)) \]

关于堆的构建和删除可以参照:https://www.cnblogs.com/dhcao/p/10591282.html

堆排序的时间是:\(O(2NlogN-O(N))\)

三、代码地址

https://github.com/dhcao/dataStructuresAndAlgorithm/blob/master/src/chapterSeven/HeasportEx.java

转载于:https://www.cnblogs.com/dhcao/p/10713840.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Teams Bot开发系列:Middleware

middleware是目前一些framework比较流行的概念,通常一个开发框架需要提供一些可扩展可定制化的功能。所以middleware这种pattern就很实用。 熟悉asp.net core的开发可能第一个想到的就是asp.net core的middleware,如下图: 当一个http reques…

ElasticSearch教程——自定义分词器(转学习使用)

一、分词器 Elasticsearch中,内置了很多分词器(analyzers),例如standard(标准分词器)、english(英文分词)和chinese(中文分词),默认是standard. s…

使用Azure Serverless来开发Teams App

Azure Function可以说比较早期的一个serverless服务,随着这些年云服务的大行其道,Serverless在概念越来越火,什么叫serverless? Serverless computing (or serverless for short), is an execution model where the cloud provide…

使用AzureFunction开发最简单的Teams Outgoing Webhook

上篇文章讲了teams app的serverless架构,这篇主要讲如何真正使用Azure Function来开发一个最最简单的Teams Outgoing Webhook。 我们先登入azure的portal,创建一个azure function。我这里创建了一个名字叫outgoing-webhook的azure function。完成后如下…

Ubuntu宿主机与VMware中其他系统虚拟机的互通

Ubuntu做宿主机,VMware中创建Windows10,并且通过三种模式实现两系统互通,其实并非是件难事。在有线网卡未接网线的环境下,关闭两系统防火墙,基本遵从下文便可实现。 转载:https://note.youdao.com/ynotesha…

使用Azure轻松实现Teams App的全球合规性

我在之前的一篇博客里面讲了合规性对于我们Teams app是非常重要的,因为office365平台就是面向全世界用户的,我们开发的teams app一旦发布后,立刻就会有各国各地区的用户来进行安装使用,所以符合用户所在地区的要求是非常重要的。 …

ADC知识(2)——直流参数(输入电压参考,参考电流输入,积分非线性误差,差分非线性误差)...

目录 四、 输入参考电压范围 五、 参考电流 六、 非线性问题 差分非线性误差 积分非线性 四、 输入参考电压范围 大多数数据手册中,将它定义为一个特定的参考电压值,通常这个电压作为 此转换器最常用的参考电压。在参考输入电压…

LuckyDraw app使用CosmosDB的成本分析

我在以前的博客里说过我的LuckyDraw app在数据存储方面使用的是 Azure Table Storage,当时选择这个的原因是成本考虑,因为它实在是便宜,对于我这种个人开发维护的免费的teams app来说,成本是一个很重要的考量点。 当然&#xff0…

React 重温之 组件生命周期

生命周期 任何事物都不会凭空产生,也不会无故消亡。一个事物从产生到消亡经理的各个阶段,我们称之为 生命周期。 具体到我们的前端组件上来,一个组件的生命周期可以大体分为创建、更新、销毁这个三个阶段。 本文主要介绍React 的组件生命周期…

10 个优质的 Laravel 扩展推荐

这里有 10 个用来搭建 Laravel 应用的包 为何会创建这个包的列表?因为我是一个「比较懒」的开发者,在脸书上是多个 Laravel 小组的成员。平日遇到最多的问题就是开发是需要用那些包。我很懒所以我不想每次都从头开始搞这些东东。 为何此文没有包括管理包…

Java:反射+泛型:获取类型参数的实例

2019独角兽企业重金招聘Python工程师标准>>> 场景描述&#xff1a; 我需要开发四个页面&#xff0c;每个页面都是只涉及增删改查的基本逻辑。 最简单的写法&#xff1a; 创建四个接口A,B,C,D&#xff0c;每个接口中都声明了增删改查四个方法,完全一致 public Map<…

servlet(1)

servlet类分级&#xff1a; 1.ServletConfig接口类&#xff1a;理解为读取servlet配置的类&#xff0c;里面有四个抽象方法如下&#xff1a; ①getServletName:获取servlet在web.xml中的名字 ②getServletContext&#xff1a;获取Servlet上下文&#xff0c;相当于web项目管理所…

如何在 Apple Silicon (M1) 上开发 Teams App

apple 在几个月前发布了自家的芯片 M1&#xff0c;由于将多核cpu&#xff0c;多核gpu&#xff0c;神经网络运算&#xff0c;内存和其他一切处理部件高度整合在一起&#xff0c;大大提高数据传输速度。发布后好评如潮&#xff0c;我也没有忍住&#xff0c;入手了一台最低配的mac…

集成学习-Adaboost

Adaboost 中文名叫自适应提升算法&#xff0c;是一种boosting算法。 boosting算法的基本思想 对于一个复杂任务来说&#xff0c;单个专家的决策过于片面&#xff0c;需要集合多个专家的决策得到最终的决策&#xff0c;通俗讲就是三个臭皮匠顶个诸葛亮。 对于给定的数据集&#…

企业数据湖构建之旅

摘要&#xff1a;随着互联网的发展&#xff0c;数据的规模和类型都呈现一个爆炸性的增长&#xff0c;对于这么多类型的数据&#xff0c;如何进行有效的管理和存储&#xff0c;包括数据的分析&#xff0c;这是大家要面临的一个问题。在武汉云栖大会上&#xff0c;阿里云高级产品…

用AzureFunction开发最简单的Teams Bot

之前我有一篇文章讲了如何在azure function上开发最简单的outgoing webhook&#xff0c;收到一些反馈&#xff0c;建议我介绍一下如果在azure function上开发teams bot&#xff0c;那这篇文章就来讲一下如何用function来快速开发bot。 我们先创建一个azure function资源&#…

关于深度学习,这些知识点你需要了解一下

深度学习概述 o 受限玻尔兹曼机和深度信念网络 o Dropout o 处理不平衡的技巧 o SMOTE&#xff1a;合成少数过采样技术 o 神经网络中对成本敏感的学习 深度学习概述 在2006年之前&#xff0c;训练深度监督前馈神经网络总是失败的&#xff0c;其主要原因都是导致…

git add * 提示warning: LF will be replaced by CRLF in 解决办法

在使用git的时候&#xff0c;每次执行 $ git add * 都会提示这样一个警告消息&#xff1a; 虽然说没有什么影响吧。 不过就是觉得太碍眼了&#xff0c; 按照这样设置就没有问题了: git config core.autocrlf false 这样设置git的配置后在执行add操作就没有问题了。 奋斗的年纪你…

Dispatch Queue 之 Invoke 当前队列

&#xfffc; 转载于:https://www.cnblogs.com/huahuahu/p/dispatch-queue-zhi-invoke-dang-qian-dui-lie.html

Teams数据统计 - 用户在线离线状态

前几天我在wechat的moments里看到以为朋友发了腾迅会议的对用户个人的年度数据统计&#xff0c;看上去很有大数据感。 实际上 Teams 也具备的类似的能力&#xff0c;只是它把这个能力开放给了开发人员&#xff0c;我们可以通过强大的 Graph API&#xff0c;获取大量的数据信息&…