【排序】堆排序(C语言实现)

文章目录

  • 前言
  • 1. 堆排序
    • 1.1 堆排序的思想
    • 1.2 堆排序的实现
  • 2. 为什么向下调整而不是向上调整




前言


本章主要会讲堆排序的实现过程以及向上调整和向下调整的时间复杂度,在学习本章前,需要对堆、以及向上调整和向下调整有一个了解,如果不了解的话可以先看看这篇文章:《堆的实现及TOP-K问题》


1. 堆排序


1.1 堆排序的思想

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆

这里以升序为例:我们通过一个向下调整的算法建一个大堆,然后将第一个数据和最后一个数据交换一下,以此类推,把大的数往后面放。

1.2 堆排序的实现

在这里插入图片描述

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

我们用代码来实现一下它的逻辑:

// 向下调整
void AdjustDown(int* a, int size, int parent) // 建大堆
{
	int child = parent * 2 + 1; // 左孩子

	while (child < size)
	{
		// 判断左孩子和右孩子哪个大,就令child等于哪个孩子
		if (child + 1 < size && a[child] < a[child + 1]) 
		{
			++child;
		}
		if (a[parent] < a[child])
		{
			Swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
			break; // 如果父亲和孩子不用交换,就代表已经排好了,不需要再往后比较
	}
}

void HeapSort(int* a, int n)
{
	// 建一个大堆
	for (int i = (n - 1 - 1) / 2;i >= 0;i--)
	{
		AdjustDown(a, n, i);
	}

	int end = n - 1;
	while (end >= 0)
	{
		Swap(&a[0], &a[end]); // 将堆顶元素换到最后一个位置
		AdjustDown(a, end, 0); // 左闭右开区间
		--end; // 调整end的位置
	}
}


2. 为什么向下调整而不是向上调整


上面堆排序的时候,不论是建堆还是排序的时候使用的是向下调整的算法,那么为什么不用向上调整的算法呢?

在这里我们先来看一下向下调整算法:

在这里插入图片描述

再来看看向上调整算法:
在这里插入图片描述
很明显,我们可以看出向下调整的时间复杂度是要比向上调整算法的时间复杂度低的,所以我们只要掌握住向下调整算法就可以了,向上调整算法就当做个了解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念&#xff08;例如 Biba、Star Model、Bell-LaPadula 等模型&#xff09;基于系统安全要求选择控制措施理解信息系统 (IS) 的安…

Nginx多ip部署多站点

目录 1.修改网卡配置信息 2.修改主要配置文件nginx.conf 1.修改网卡配置信息 1)来到网卡配置文件存放目录下 cd /etc/sysconfig/network-scripts/ 2)对 ifcfg-ens33 文件进行配置修改前先进行备份 cp ifcfg-ens33 ifcfg-ens33.default 3)先修改成最小配置&#xff0c;使用 d…

QT音频编程实战项目(二)

接上一篇 我们在实现完槽函数的定义后&#xff0c;我们应该将这些槽函数和对应的信号连接起来 接着将每个控件都对应转到槽进行实现&#xff1a; 这个是对打开文件呢个控件转到槽的具体操作&#xff1a; 首先通过QDir::homePath()获得用户的主目…

CCNP课程实验-05-Comprehensive_Experiment

目录 实验条件网络拓朴 基础配置实现IGP需求&#xff1a;1. 根据拓扑所示&#xff0c;配置OSPF和EIGRP2. 在R3上增加一个网段&#xff1a;33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP&#xff0c;并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为666&…

java工作流详解

什么是工作流&#xff1f; 工作流&#xff1a;两个或两个以上的人&#xff0c;为了共同的目标&#xff0c;连续的以串行或并行的方式去完成某一业务。 业务&#xff1a;工作流所指业务涵盖了与经营相关的活动。 串行或并行&#xff1a;业务中的步骤也许以一步接着一步的方式…

YOLOv8改进:IoU系列篇 | Shape-IoU关注边界框本身的形状和尺度来计算损失 | 2023年12月最新IoU改进

🚀🚀🚀本文改进: 提出了一种新颖的Shape-IoU,小目标检测实现涨点,更加关注边界框本身的形状和尺度来计算损失 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.Shape-IoU原理介绍 论文:https://ar…

【ps】如何给人偶添加衣服

使用PS工具扣出人物 使用编辑-变形-操控变型 、

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中&#xff0c;可以将【参数】放在【路由路径】中&#xff0c; 从而实现&#xff0c;同一个 路由&#xff0c;同一个组件&#xff0c;因路径参数不同&#xff0c;可以渲染出不同的内容。特点 &#xff1a; 1、当携带不同路径参数的路由相互跳转时&am…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

二叉搜索树介绍以及实现

二叉树无论是在实际运用还是面试题中&#xff0c;都是一种十分热门的数据结构&#xff0c;而二叉搜索树则是进阶版的二叉树&#xff0c;在map和set中也有应用。 什么是二叉搜索树 二叉搜索树又叫二叉排序树&#xff0c;它可以是一颗空树&#xff0c;又或者是有以下三个特点的…

用简单的方式理解串行主从通信方式(适用于LEU与TCC等外部设备之间的通信)

串行通信方式 数据按位序传送&#xff0c;最少需要两根通道&#xff08;如RS485、CAN总线、以太网&#xff09;。 优点&#xff1a;成本低&#xff0c;适合远距离通信。 缺点&#xff1a;速度慢、效率低。 注&#xff1a;以上特征为相较于并行通信方式。 主从通信方式 以RS4…

skimage图像处理(全)

文章目录 一、简介二、安装三、模块简介&#xff1a;API reference四、项目实战4.1、2D图像处理4.1.1、打印图像属性4.1.2、读取 / 显示 / 保存图像&#xff1a;skimage.io.imread() skimage.io.imshow() skimage.io.imsave()4.1.3、颜色空间转换&#xff1a;skimage.color.r…

轻松搞定软件开发:找对软件开发公司的流程与注意事项!

随着数字化时代的来临&#xff0c;软件开发在企业和个人生活中扮演着越来越重要的角色&#xff0c;然而&#xff0c;如何找到一家合适的软件开发公司却成为了一个令人头疼的问题。 本文将为你详细解读找软件开发公司的流程&#xff0c;以及在选择过程中需要注意的事项&#xf…

十大排序的个人总结之——冒泡排序、插入排序

同样&#xff0c;这两几乎也是被淘汰了的算法&#xff0c;尽管它们是稳定的&#xff0c;但是时间复杂度没人喜欢&#xff0c;了解一下就好&#xff0c;没啥好说的&#xff0c;注意最后一句话就行了 一&#xff0c;冒泡排序 1. 算法步骤 共n-1趟&#xff0c;谁两敢冒泡就换了…

C++ 不能用作全局变量名或给定 C 语言的链接

错误&#xff1a; C 不能用作全局变量名或给定 C 语言的链接 解决方案&#xff1a; 先抽自己两巴掌。 问问自己main函数作为一个函数&#xff0c;后面有没有添加&#xff08;&#xff09;&#xff1f; 如果没有&#xff0c;建议再给自己两巴掌。

解决Golang WriteHeader设置后,Content-Type失效的问题

场景 最近笔者在研究web框架过程中&#xff0c;发现了一个响应类型的问题&#xff0c;困扰许久&#xff0c;原因就是设置了响应状态码后&#xff0c;然后设置响应类型为application/json。在实际请求后&#xff0c;响应类型变成了text/plain; charsetutf-8格式。 问题解决&…

梳理Langchain-Chatchat-UI接口文档

在 Langchain-Chatchat v0.1.17 版本及以前是有前后端分离的 Vue 项目的&#xff0c;但是 v0.2.0 后就没有了。所以本文使用的是 Langchain-Chatchat v0.1.17 版本中的 Vue 项目。经过一番折腾终于将 Langchain-Chatchat v0.1.17 版本前端 Vue 接口和 Langchain-Chatchat v0.2.…

YOLOv8改进 | 注意力篇 | ACmix自注意力与卷积混合模型(提高FPS+检测效率)

一、本文介绍 本文给大家带来的改进机制是ACmix自注意力机制的改进版本&#xff0c;它的核心思想是&#xff0c;传统卷积操作和自注意力模块的大部分计算都可以通过1x1的卷积来实现。ACmix首先使用1x1卷积对输入特征图进行投影&#xff0c;生成一组中间特征&#xff0c;然后根…

vim学习记录

目录 历史记录前言相关资料配置windows互换ESC和Caps Lock按键 基本操作替换字符串 历史记录 2024年1月2日, 搭建好框架,开始学习; 前言 vim使用很久了,但是都是一些基本用法,主要是用于配置Linux,进行一些简单的编写文档和程序.没有进行过大型程序开发,没有达到熟练使用的程…

基础算法(8):高精度加减乘除

目录 1.高精度加法 模板&#xff1a; 例题&#xff1a; 2.高精度减法 模板&#xff1a; 例题&#xff1a; 3.高精度乘法 3.1 高精度乘低精度 模板&#xff1a; 例题&#xff1a; 3.2 高精度乘高精度 模板&#xff1a; 例题&#xff1a; ​编辑 4.高精度除法 模…