【408数据结构与算法】—堆排序(二十一)

news2025/7/9 11:28:34

【408数据结构与算法】—堆排序(二十一)

一、堆的定义

在这里插入图片描述
从堆的定义可以看出,堆实质是满足如下性质的完全二叉树,二叉树中任一非叶子结点均小于(大于)它的孩子结点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
C语言代码实现

#include <stdio.h>
#include <malloc.h>
void HeapAdjust(int a[],int s,int m)//一次筛选的过程
{
    int rc,j;
    rc=a[s];
    for(j=2*s;j<=m;j=j*2)//通过循环沿较大的孩子结点向下筛选
    {
        if(j<m&&a[j]<a[j+1]) j++;//j为较大的记录的下标
        if(rc>a[j]) break;
        a[s]=a[j];s=j;
    }
    a[s]=rc;//插入
}
void HeapSort(int a[],int n)
{
    int temp,i,j;
    for(i=n/2;i>0;i--)//通过循环初始化顶堆
    {
        HeapAdjust(a,i,n);
    }
    for(i=n;i>0;i--)
    {
        temp=a[1];
        a[1]=a[i];
        a[i]=temp;//将堆顶记录与未排序的最后一个记录交换
        HeapAdjust(a,1,i-1);//重新调整为顶堆
    }
}
int main()
{
    int n,i;
    scanf("%d",&n);
    int a[n+1];
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    HeapSort(a,n);
}

判断是否是堆?

在这里插入图片描述

二、堆排序

若在输出堆顶的最小值(最大值)后,使得剩余n-1 个元素的序列重新建成一个堆,则得到n个元素的次小值(次大值)如此反复,便能得到一个有序序列,这个过程称为堆排序

三、实现堆排序需要解决两个问题

(一)、如何在输出堆顶元素后,调整剩余元素为一个新的堆?

小根堆

  • 输出堆顶元素之后,以堆中的最后一个元素替代
  • 然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换
  • 重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为筛选。

堆的调整
在这里插入图片描述

筛选过程的算法描述为

在这里插入图片描述
从以上代码可以看出:对于一个无序序列反复筛选就可以得到一个堆即从一个无序序列建堆的过程就是一个反复筛选的过程

(二)、如何由一个无序序列建成一个堆?

😛堆的建立

  • 显然单结点的二叉树是堆;
  • 在完全二叉树中所有以子节点(序号i>n/2)为根的子树是堆

由于堆实质是一个线性表,那么我们可以顺序存储一个堆

例如:有关键字为49,38,65,97,76,13,27,49的一组记录,将其按关键字调整为一个小根堆
在这里插入图片描述
在这里插入图片描述
由以上分析知:

若一个无序序列建堆,然后输出根,重复该过程就可以由一个无序序列输出有序序列

实际上,堆排序就是利用完全二叉树中父结点与孩子结点之间的内在关系来排序的。

堆排序算法
在这里插入图片描述
算法性能分析:

  • 初始化时间不超过O(n)
    在这里插入图片描述
  • 堆排序的时间主要耗费在建初始堆和调整建新堆时进行的反复筛选上,堆排序在最坏的情况下,其时间复杂度为O(nlog2n),这是堆排序的最大优点。无论待排序列还是逆序排列,都不会使堆排序处于最好或最坏的状态。
  • 另外,堆排序仅需一个记录大小交换用的辅助存储空间
  • 然而堆排序是一种不稳定的排序方法,它不是适用于待排序记录个数 n较少的情况,但对于n较大的文件还是很有效的。

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

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

相关文章

python零基础入门教程(非常详细),从零基础入门到精通,看完这一篇就够了

前言 本文罗列了了python零基础入门到精通的详细教程&#xff0c;内容均以知识目录的形式展开。 第一章&#xff1a;python基础之markdown Typora软件下载Typora基本使用Typora补充说明编程与编程语言计算机的本质计算机五大组成部分计算机三大核心硬件操作系统 第二章&…

java计算机毕业设计ssm健达企业项目管理系统

项目介绍 随着经济的发展和信息技术的普及,国内许多健达企业都面临了重大的挑战。健达企业的管理流程、战略规划如果不能进行调整,极有可能面临淘汰的风险。特别是企业项目的处理,面对大量的人员信息和业务信息,如果不使用信息系统进行有效的管理和利用,那就会阻碍健达企业的发…

[附源码]SSM计算机毕业设计中华美食网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

gcc和g++的使用

linux编译器-gcc和g的使用 文章目录linux编译器-gcc和g的使用预处理编译汇编链接函数库动态库和静态库file 查看可执行程序ldd 查看可执行程序格式make和makefilestat 查看文件或目录时间在讲gcc和g编译同时&#xff0c;我们复习一下程序翻译的大概过程&#xff0c;并以此为例切…

IntelliJ IDEA 配置启动SprintBoot项目

【原文链接】IntelliJ IDEA 配置启动SprintBoot项目 文章目录一、IDEA 配置maven二、IDEA 配置jdk三、IDEA 启动项目一、IDEA 配置maven &#xff08;1&#xff09; 首先本机配置好maven&#xff0c;具体可参考 Win10系统如何安装配置maven &#xff08;2&#xff09;然后在打…

Windows10中使用VS2022和Cmake编译构建C++开源日志库-spdlog

一、关于C中的开源日志库spdlog Java中有很多日志库&#xff1a;java.util.logging、Log4j、Logback、Log4j2、slf4j、common-logging。C的日志库相对来说就比较少了&#xff0c;比如说glog、log4cpp、spdllog等&#xff0c;目前个人感觉比较好用的C开源日志库当属于spdlog了&…

这次把怎么做好一个PPT讲清-审美篇

要提高审美&#xff0c;主要是靠不断的看优秀的作品来知道什么是美的&#xff0c;这个短时间很难速成&#xff0c;只能靠不断的积累。 如何做出具有高级感的PPT&#xff1f; 已剪辑自: https://zhuanlan.zhihu.com/p/38642831 很多年前&#xff0c;走在大街上的PPT大多长得像…

打破边界,边缘计算有何应用场景?

近年来&#xff0c;随着5G、物联网、人工智能技术的发展&#xff0c;越来越多设备接入到互联网中&#xff0c;数据呈现爆炸式增长&#xff0c;对算力、延时提出更好要求&#xff0c;能够在靠近数据源头位置提供计算服务的边缘计算快速兴起&#xff0c;打破更多的场景边界&#…

火法冶炼高冰镍制电池级硫酸镍除硅

#火法冶炼高冰镍制电池级硫酸镍除硅 从供需角度&#xff0c;红土镍矿为最主要原生镍供应来源&#xff0c;而下游需求中不锈钢占据75%-80%份额&#xff0c;最主要的镍供需路径为红土镍矿火法冶炼-镍铁-不锈钢。 但下游需求中电池对硫酸镍的需求增速显著&#xff0c;红土镍矿火法…

m基于matlab的信息传输系统包括卷积编码,QPSK调制解调以及维特比译码

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 信息传输系统主要包括信号发送&#xff0c;信号传输模块&#xff0c;信号接收模块&#xff0c;其中信号发送包括信号的产生&#xff0c;信源的编码&#xff0c;信号的调制等模块&#xf…

24节气—小雪海报、文案分享。雨凝成雪,万物冬藏。

24节气小雪将至。农谚&#xff1a;“小雪雪满天&#xff0c;来年必丰年。”就是指小雪的时候落雪&#xff0c;雨水充沛&#xff0c;还能冻死地里的病菌和害虫&#xff0c;来年雨水必定均匀&#xff0c;是丰收年。 下面是给大家整理的小雪节气文案及海报&#xff0c;希望大家喜欢…

400Gbps 网络面临的挑战

关于 TCP 与 100Gbps 场景的细说&#xff0c;参见&#xff1a;单流 TCP 100Gbps 难题的直观解释 400Gbps 网络将又是一个 “硬件准备好了&#xff0c;可软件没跟上” 的场景。 把一条 TCP Flow 看作一个操作系统进程&#xff0c;多条 Flow 共享 10Gbps 带宽和多进程被同一个 C…

消息队列RabbitMQ的常见面试题目

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 消息队列 ❤️ 支持我&#xff1a;&#x1f44d;点赞 &#x1…

【数据结构】栈

1.啥是栈 2.栈的使用 3.栈的自定义实现 4.划分栈&#xff0c;虚拟机栈&#xff0c;栈帧概念 &#xff08;1&#xff09;首先咱们来介绍一下什么是栈 Stack就是栈&#xff1a;栈是一种元素先进后出的一种数据结构 你可以把它想象成羽毛球筒&#xff0c;这是最直观的了&#xf…

坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?

分享一个印象深刻的线上问题&#xff0c;希望能够给 xdm 带来一点思考 一个稀松平常的工作日&#xff0c;正准备下班的时候&#xff0c;不巧&#xff0c;突发线上紧急问题&#xff0c;心中一万个不情愿&#xff0c;可还是要硬着头皮去定位问题 简单的表象为微服务之间 gRPC通…

打造高安全数字基础设施:中国电子云服务关键行业的宣言

11月18日&#xff0c;主题为“至信铸云守正创新”的2022中国电子云峰会在北京举行。中国电子云在会上发布了其服务关键行业的价值主张、分布式云战略&#xff0c;实测了仓海CeaStor分布式存储的性能。中国电子党组书记、董事长曾毅&#xff0c;中国工程院院士沈昌祥&#xff0c…

制作电子签名

每天一个PS/PR小技巧&#xff08;原理实践&#xff09; 每天一个PS/PR小技巧&#xff08;原理实践&#xff09;_Dezeming的博客-CSDN博客PS是由Adobe Systems开发和发行的图像处理软件。本文的特色在于快速上手和制作一些生活中会常用的功能&#xff0c;并且解释这些功能的具体…

DJYGUI系列文章四:GK文本显示

目录 1 GK文本显示概述 1.1 ansi系 1.2 unicode系 1.3 DJYGUI文本显示 2 字符集说明 3 字符集API说明 3.1 ModuleInstall_Charset&#xff1a;字符编码模块初始化 ​​​​​​​3.2Charset_NlsInstallCharset&#xff1a;安装字符编码 ​​​​​​​3.3 Charset_NlsG…

1527_AURIX_TriCore内核架构开篇与架构概述

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 看文档的时候&#xff0c;引用了内核架构的内容。这方面我没有看过&#xff0c;除了ARM也没有什么内核算是较为认真的看过。纵然是ARM&#xff0c;看…

锐捷MSTP实验配置

目录 Vlan基础配置 多生成树配置 查看生成树信息 MSTP其它特性配置 边缘端口 生成树保护特性 生成树时间特性 Vlan基础配置 SW1、SW2配置Vlan vlan range 10,20,40 int g0/0 switchport mode trunk switchport trunk allowed vlan add 10,2…