堆排序详解

了解堆的操作向上(下)调整算法可以看我的上一篇文章:
详解(实现)堆的接口函数

文章目录

  • 堆是什么?
  • 堆排序的原理
  • 如何建堆?怎样建堆更快?
    • 1.使用向上调整算法建堆
      • 时间复杂度分析
    • 2.使用向下调整算法建堆
      • 时间复杂度分析
    • 结论:使用向下调整算法建堆更好
  • 堆排序的实现
  • 堆排序的时间复杂度
  • 堆排序的稳定性

堆是什么?

堆排序,堆排序,首先就要知道堆是什么

堆是顺序存储逻辑结构是二叉树的特殊数据结构

如下图:
在这里插入图片描述
堆只有大堆(大顶堆)和小堆(小顶堆)
大堆:左右孩子节点中存储的数据都必须小于等于父亲节点,根节点最大
小堆:左右孩子节点中存储的数据都必须大于等于父亲节点,根节点最小

了解堆的操作向上(下)调整算法可以看我的上一篇文章:
详解(实现)堆的接口函数


堆排序的原理

根据堆的特点:

堆只有大堆(大顶堆)和小堆(小顶堆)
大堆:左右孩子节点中存储的数据都必须小于等于父亲节点,根节点最大
小堆:左右孩子节点中存储的数据都必须大于等于父亲节点,根节点最小

可知大(小)堆堆顶的数据一定是堆中存储的所有元素中最大(小)的

所以我们只需要将堆顶数据(顺序表第一个元素)和堆的最后一个元素交换(顺序表最后一个元素),
堆中的最大(小)的元素就到了顺序表的最后

虽然交换之后的顺序表不是堆了,但是只需要将交换到堆顶的数据,进行一次向下调整算法,得到的就又是一个大(小)堆,而且一次向下调整算法的时间复杂度只有O(logN)

再将顺序表的倒数第二个元素当做新的最后一个元素,与调整后新的堆顶换…………
如此循环

我们就可以得到一个有序表了

由上得:
排升序,建
排降序,建


如何建堆?怎样建堆更快?

根据堆排序的原理可得:
实现对排序之前,要先将要排序的数据建堆

那么如何建堆?
有两个方法建堆

1.使用向上调整算法建堆

在这里插入图片描述
在这里插入图片描述

将要排序的数据从头到尾一个一个进行向上调整算法即可

时间复杂度分析

在这里插入图片描述

由上图得:
每一层的节点向上调整的最大次数不一样,所以要分开加算

总的调整次数为F(h):
F(h)=20 X 0+ 21 X 1+22 X2+…………+2(h-1) X(h-1)

使用错位相减法后,化简得:
F(h)=2h X(h-2)+2

由完全二叉树的特性得:
h=log N
2h-1=N

带入F(h)得
F(h)=(N+1)*(logN-2)+2

所以时间复杂度为:O(N*logN)


2.使用向下调整算法建堆

最后一个非叶子节点开始调整,调整到顺序表第一个元素(下标为0的元素)

在这里插入图片描述
在这里插入图片描述

时间复杂度分析

在这里插入图片描述
由上图得:
每一层的节点向上调整的最大次数不一样,所以要分开加算

总的调整次数为F(h):
F(h)=20 x(h-1) +21 x(h-2)+…………+2(h-2)x1+2(h-1)x0

使用错位相减法后,化简得:
F(h)=2h-1-(h-1)

由完全二叉树的特性得:
h=log N
2h-1=N

带入得
F(N)=N-logN

所以时间复杂度为:O(N)


结论:使用向下调整算法建堆更好

堆排序的实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
循环上图的过程,即可得到一个有序表


堆排序的时间复杂度

如下图:
在这里插入图片描述
所以堆排序总的时间复杂度为O(N*logN)


堆排序的稳定性

堆排序并不是一个稳定的排序算法

在堆排序的过程中,当交换了堆顶元素后,进行向下调整时,有可能破坏了相同元素之间的稳定性。

例如,第n/2个父节点可能交换了后面一个元素,而第n/2-1个父节点没有交换后面一个相同的元素,这样就破坏了这两个相同元素之间的稳定性。


以上就是全部内容了,如果对你有帮助的话可以点赞收藏支持一下!

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

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

相关文章

【HarmonyOS】ArkUI - 状态管理

在声明式 UI 中,是以状态驱动视图更新,如图1所示: 图1 其中核心的概念就是状态(State)和视图(View): 状态(State):指驱动视图更新的数据&#xf…

绿色节能|AIRIOT智慧建材能耗管理解决方案

建材供应是建筑业不可或缺的一个重要环节,在环保和企业可持续发展的双重需求下,建材生产商对建材生产过程中的能耗掌握和能耗管理尤其关注。但在实际生产和运营过程中,传统的建材能耗管理方式往往存在如下痛点: 用户管理权限不完善…

[医学分割大模型系列] (1) SAM 分割大模型解析

[医学大模型系列] [1] SAM 分割大模型解析 1. 特点2. 网络结构2.1 Image encoder2.2 Prompt encoder2.3 Mask decoder 3. 数据引擎4. 讨论 论文地址:Segment Anything 开源地址:https://github.com/facebookresearch/segment-anything demo地址&#x…

1、初识JVM

一、JVM是什么? JVM的英文全称是 Java Virtual Machine,其中文译名为Java虚拟机。它在本质上就是是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 JVM执行流程如下 二、JVM有哪些功能? 2.1 解释和运行 对字节码文…

平衡隐私与效率,Partisia Blockchain 解锁数字安全新时代

原文:https://cointelegraph.com/news/exploring-multiparty-computations-role-in-the-future-of-blockchain-privacy; https://medium.com/partisia-blockchain/unlocking-tomorrow-outlook-for-mpc-in-2024-and-beyond-cb170e3ec567 编译&#xff1…

数据仓库系列总结

一、数据仓库架构 1、数据仓库的概念 数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。 数据仓库通常包含多个来源的数据,这些数据按照主题进行组织和存储&#x…

蓝桥杯练习——神秘咒语——axios

目标 完善 index.js 中的 TODO 部分,通过新增或者修改代码,完成以下目标: 点击钥匙 1 和钥匙 2 按钮时会通过 axios 发送请求,在发送请求时需要在请求头中添加 Authorization 字段携带 token,token 的值为 2b58f9a8-…

【DataWhale学习】用免费GPU线上跑chatGLM、SD项目实践

用免费GPU线上跑chatGLM、SD项目实践 ​ DataWhale组织了一个线上白嫖GPU跑chatGLM与SD的项目活动,我很感兴趣就参加啦。之前就对chatGLM有所耳闻,是去年清华联合发布的开源大语言模型,可以用来打造个人知识库什么的,一直没有尝试…

基于python+vue 的一加剧场管理系统的设计与实现flask-django-nodejs-php

二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

从0到1实现RPC | 02 RpcConsumer的远程调用

一、RPC的简化版原理如下图(核心是代理机制)。 1.本地代理存根: Stub 2.本地序列化反序列化 3.网络通信 4.远程序列化反序列化 5.远程服务存根: Skeleton 6.调用实际业务服务 7.原路返回服务结果 8.返回给本地调用方 二、新建一个模块rpc-demo-c…

Docker容器初始

华子目录 docker简介虚拟化技术硬件级虚拟化硬件级虚拟化历史操作系统虚拟化历史基于服务的云计算模式 什么是dockerDocker和传统虚拟化方式的不同之处为什么要使用docker?Docker 在如下几个方面具有较大的优势 对比传统虚拟机总结docker应用场景docker改变了什么 基…

WebClient上载文件——实现将本地文件同步到远端服务器上

问题描述 用户上传产品示例图片到服务器端上,客户端在请求图片资源时,当服务端架设了多个节点的情况下,由于没有负载均衡请求到保存图片资源的服务器,出现图片访问404的问题。 这里保存上传文件时,同时需要将该文件保…

30V转5V 1A 30降压12V 1A DCDC低电压恒压IC 车充芯片-H4110

30V转5V和30V转12V的DCDC低电压恒压IC(也称为降压恒压芯片或车充芯片)工作原理如下: 输入电压识别:芯片首先识别输入的30V电压,并准备进行转换。 PWM控制:芯片内部的控制逻辑生成PWM信号。这个信号用于控制…

基于python+vue文学名著分享系统的设计与实现flask-django-nodejs-php

随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理存在工作效率…

easyExcel大数据量导出oom

easyExcel大数据量导出 异常信息 com.alibaba.excel.exception.ExcelGenerateException: java.lang.OutOfMemoryError: GC overhead limit exceededat com.alibaba.excel.write.ExcelBuilderImpl.fill(ExcelBuilderImpl.java:84)at com.alibaba.excel.ExcelWriter.fill(Excel…

huggingface的transformers训练bert

目录 理论 实践 理论 https://arxiv.org/abs/1810.04805 BERT(Bidirectional Encoder Representations from Transformers)是一种自然语言处理(NLP)模型,由Google在2018年提出。它是基于Transformer模型的预训练方法…

STM32 AD单通道函数设计

单片机学习! 目录 文章目录 前言 一、ADC配置步骤 二、详细步骤 2.1 开启RCC时钟 2.2 配置GPIO 2.3 配置多路开关 2.4 配置ADC转换器 2.5 开启ADC电源 2.6 ADC进行校准 2.6.1 复位校准 2.6.2 等待复位校准完成 2.6.3 开始校准 2.6.4 等待校准完成 三、启动AD转换函数…

selenium自动化登录模块HTMLTestRunner测试报告

1.下载HTMLTestRunner.py放到python的Lib目录下,python3之后的,文件要修改以下内容: 第94行,将import StringIO修改成import io 第539行,将self.outputBuffer StringIO.StringIO()修改成self.outputBuffer io.Strin…

WordPress站点如何实现发布文章即主动推送到神马搜索引擎?

平时boke112百科很少关注到神马搜索引擎,近日有站长留言想要实现WordPress站点发布文章就主动推送到神马搜索引擎,而且推送成功就自动添加一个自定义字段,以防重复推送。 登录进入神马站长平台后才知道神马也有一个API推送功能,不…

GitHub Copilot+ESP开发实战-串口

上篇文章讲了GitHub Copilot在应用中可能遇到的问题,接下来小启就简单介绍下GitHub Copilot在ESP32开发中C语言实现串口功能,感兴趣的可以看看。 一、向Copilot提问: 1. ESP32用C语言实现串口初始化; 2.配置uart为1&#xff0c…