排序算法-堆排序(含C语言代码示例)

一、算法介绍

        堆排序是一种基于二叉堆数据结构的排序算法。首先,构建最大堆(或最小堆),将待排序的数组视作一个完全二叉树,通过从最后一个非叶子节点开始向上调整,使得每个父节点的值都大于等于(最大堆)或小于等于(最小堆)其子节点的值。这步骤确保了最大(或最小)值位于堆的根节点。

        然后,将堆顶元素(最大值或最小值)与数组的最后一个元素交换位置,并将堆的大小减一。接着,对新的堆顶进行堆调整,使得剩余元素重新满足堆的性质。重复以上步骤,直到堆的大小减至1,即完成排序。

        堆排序的时间复杂度为O(n log n),其中n是待排序数组的长度。它具有原地排序的特点,不需要额外的辅助空间,且相对于快速排序等算法,堆排序在最坏情况下也能保持较好的性能。然而,与归并排序相比,堆排序对于稳定性的保持较差,因为在堆调整的过程中可能破坏相同元素之间的相对顺序。

二、代码示例

void swap(int *a, int *b) {int temp = *b;*b = *a;*a = temp;
}void max_heapify(int index[], int start, int end) {int dad = start;int son = dad * 2 + 1;while (son <= end) {if (son + 1 <= end && index[son] < index[son + 1])son++;if (index[dad] > index[son])return;else {swap(&index[dad], &index[son]);dad = son;son = dad * 2 + 1;}}
}void heap_sort(int index[], int len) {int i;for (i = len / 2 - 1; i >= 0; i--)max_heapify(index, i, len - 1);for (i = len - 1; i > 0; i--) {swap(&index[0], &index[i]);max_heapify(index, 0, i - 1);}
}

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

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

相关文章

科研绘图(四)火山图

火山图是生物信息学中常用的一种图表&#xff0c;用来显示基因表达数据的变化。它通常将每个点表示为一个基因&#xff0c;x轴显示对数比率&#xff08;log ratio&#xff09;&#xff0c;表示基因表达的变化大小&#xff1b;y轴显示-log10(p-value)&#xff0c;表示变化的统计…

跨镜动线分析丨用AI解读顾客行为,助力零售企业运营与增长

步入数字时代&#xff0c;先进技术让传统零售焕发新生。智慧零售以用户为中心&#xff0c;“人”的数据化价值将反哺生产、渠道、销售、运营全场景。 悠络客正式推出“跨镜动线分析”&#xff0c;运用AI技术&#xff0c;深度分析顾客的进店、逛店等一系列行为&#xff0c;助力零…

host没有管理员权限

1 以管理员身份运行 Windows PowerShell 2 输入 notepad C:\Windows\System32\drivers\etc\hosts 3在自动弹出的host文件里添加信息&#xff0c;然后保存即可

求射线与三角形交点(C#代码Unity环境下测试通过)

上代码&#xff1a; bool RayCrossTriAngle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, out Vector3 point) {point Vector3.zero;Vector3 normal Vector3.Cross(p2 - p1, p3 - p1);float t -Vector3.Dot((ray.origin - p1), normal) / Vector3.Dot(ray.direction, nor…

Fluids —— Viscosity: honey

目录 Fixed viscosity: honey Point variable viscosity: honey Fixed viscosity: honey SOP FLIP提供的粘性解释器&#xff0c;可对恒定或变化的粘性&#xff1b;以下是恒定粘性的蜂蜜模拟&#xff0c;蜂蜜的特性与粘度和表面张力等参数相关&#xff0c;可观察到典型的缠绕和…

C#中类型的转换

类型转换 什么是类型转换 类型转换 就是不同变量类型之间的相互转换 类型转换--隐式转换 隐式转换的基本规则--不同类型之间自动转换 大范围装小范围 知识点一 相同大类之间的转换 有符号 long-->int-->short-->sbyte 无符号 ulong-->uint-->ushort-->…

机器学习周报第28周

目录 摘要Abstract一、文献阅读1.题目&#xff1a;2.摘要3.问题描述4.过去方案5.论文方案6.论文模型7.相关代码 摘要 本周阅读了一篇混沌时间序列预测的论文&#xff0c;论文模型主要使用的是时间卷积网络&#xff08;Temporal Convolutional Network&#xff0c;TCN&#xff…

【ARM 嵌入式 编译系列 3.4 -- 查看所依赖库文件的路径 详细介绍】

文章目录 问题背景库文件路径查看库文件路径信息打印显示连接标准库不使用标准库 libgcc.a问题背景 在自己构建的 Makefle系统中对 cortex-m33 代码编译时,在链接阶段总是报出下面问题 ... arm-none-eabi-ld: cannot find libgcc.a: No such file or directory arm-none-eab…

c++关键字static

1. 静态成员变量和函数并不依赖于类的任何对象&#xff0c;它们是类的属性&#xff0c;因此不需要通过类的对象访问&#xff0c;可以通过类名直接访问。 2. 静态成员变量和函数是公有的&#xff0c;可被所有对象访问&#xff0c;但是无法访问类的非静态成员。 3. 静态成员变量…

2624. 蜗牛排序

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 请你编写一段代码为所有数组实现 snail(rowsCount&#xff0c;colsCount) 方法&#xff0c;…

5.Pytorch模型单机多GPU训练原理与实现

文章目录 Pytorch的单机多GPU训练1)多GPU训练介绍2)pytorch中使用单机多GPU训练DistributedDataParallel(DDP)相关变量及含义a)初始化b)数据准备c)模型准备d)清理e)运行 3)使用DistributedDataParallel训练模型的一个简单实例 欢迎访问个人网络日志&#x1f339;&#x1f339;知…

数学建模day15-时间序列分析

时间序列也称动态序列&#xff0c;是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分&#xff0c;分别是描述过去、分析规律和预测未来&#xff0c;本讲将主要介绍时间序列分析中常用的三种模型&#xff1a;季节分解、指数平滑方法和AR…

【Java-随笔】常用依赖

Jsoup https://mvnrepository.com/artifact/org.jsoup/jsoup <!-- "Jsoup"依赖项 --> <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3</version> </dependency>H…

Mysql运算符

文章目录 比较运算符< > !IS NULL \ IS NOT NULL \ ISNULLLEAST() \ GREATEST() 查询数据大小&#xff08;字典序&#xff09;BETWEEN...AND...IN (SET) \ NOT IN (SET)LIKE 模糊查询REGEXP \ RLIKE 逻辑运算符逻辑运算符&#xff1a; OR &#xff08;||&#xff09;、A…

二分算法有关题目与解析

二分算法最重要的就是边界问题&#xff0c;边界一定要确定好&#xff0c;并且自己也要清晰&#xff0c;要不然就会混乱。 什么时候用到二分呢&#xff1f;当涉及到快速筛选有序序列的时候就应该想到&#xff0c;其实二分也经常跟排序算法结合着一起使用 关键模板 一个是确立…

SQL安全:常见手段

前面我们从基础的单表查询一直聊到优化&#xff0c;讲了SQL的很多内容。这一节我们来说说怎么让我们的数据库变得更安全。 为了实现常见的业务场景&#xff0c;数据库会提供很多的功能。有一些功能如果被攻击者利用&#xff0c;就很容易获取到不应该让其获取到的信息。比如uni…

演示kotlin的structured concurrency简化并发异步操作

文章目录 准备http客户端同步调用异步调用structured concurrency用例与机制浅析补充说明 用springboot的 kotlin demo&#xff0c;帮助理解structured concurrency简化异步并发调用的机制 准备http客户端 使用同时支持同步和异步调用的java.net.http.HttpClient Configurat…

vue笔记之$listeners

含义 将事件从父组件传递到子组件 作用 可以实现孙组件的数据传递到爷组件中去 示例 爷组件 <template><div id"app">我是爷组件<h3>{{ fromSunData }}</h3><fu fromSun"fromSun"></fu></div> </templ…

python期末考试:python的基本使用

1. 以下关于Python语言技术特点的描述中&#xff0c;错误的是&#xff08; &#xff09;。 A. 对于需要更高执行速度的功能&#xff0c;例如数值计算和动画&#xff0c;Python语言可以调用C语言编写的底层代码 B. Python比大部分编程语言具有更高的软件开发产量和简洁性 C. …

WEB服务器-Tomcat

3. WEB服务器-Tomcat 3.1 简介 3.1.1 服务器概述 服务器硬件 指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算机大很多。 服务器&#xff0c;也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求&#xff0c;并进行处理&#xff0c;因此一般来说…