选择排序(简单选择排序、堆排序)

news2025/4/20 22:58:20

简单选择排序(Selection Sort)

1. 算法思想

它通过多次遍历数组,每次从未排序部分中选择最小(或最大)的元素,将其放到已排序部分的末尾(或开头),直到整个数组有序。


2. 示例

原始数组[64, 25, 12, 22, 11]

  • 第1轮(从未排序的n个元素中查找)
    • 找到最小值 11,与第1个元素 64 交换。
    • 结果:[11, 25, 12, 22, 64]
  • 第2轮(从未排序的n - 1个元素中查找)
    • 找到最小值 12,与第2个元素 25 交换。
    • 结果:[11, 12, 25, 22, 64]
  • 第3轮
    • 找到最小值 22,与第3个元素 25 交换。
    • 结果:[11, 12, 22, 25, 64]
  • 第4轮
    • 剩余部分已排序,无需交换。

最终结果[11, 12, 22, 25, 64]


4. 时间复杂度
  • 最坏情况O(n²)(当数组完全逆序时)。
  • 最好情况O(n²)(即使数组已排序,仍需比较所有元素)。
  • 平均情况O(n²)

5. 空间复杂度
  • 原地排序O(1),只需常数级别的额外空间。

6. 稳定性
  • 不稳定:当存在相等元素时,可能改变它们的相对顺序。比如L={2,2,1},第一趟排序:L={1,2, 2},最终排序:L={1,2, 2};可以看到元素两个2的顺序发生了变化。

8. 代码实现
void SelectSort(ElemType A[], int n) {
	for (int i = 0; i < n; i++) {
		int min = i;
		//找到未排序元素中的最小值
		for (int j = i + 1; j < n; j++) 
			if (A[j] < A[min]) min = i;
		
		//将最小值放入已排序序列的末尾
		if (min != i)
			swap(A[i], A[min]);
	}
	
}

堆排序(Heap Sort)

1.堆的概念

n个关键字序列L[1…n]称为堆,当且仅当满足:

  • L(i) >= L(2i) 且 L(i) >= L(2i+1) 此时为大顶堆
  • L(i) <= L(2i) 且 L(i) <= L(2i+1) 此时为小顶堆

2.创建堆(以大顶堆为例)

建堆步骤:

  • 确定最后一个非叶结点的序号i = n/2
  • 判断是否符合大顶堆规则
  • 如果符合则对第i-1个结点从步骤二开始
  • 如果不符合规则,则与较大的叶子结点交换,然后对其子树从步骤二开始
    在这里插入图片描述

3.堆排序代码实现

堆排序分为两个主要阶段:建堆排序

  1. 建堆

    • 将无序数组调整为大顶堆(或小顶堆)。
    • 从最后一个非叶子节点开始,向上调整堆结构,确保每个子树满足堆的性质。
  2. 排序

    • 将堆顶元素(最大值)与堆的最后一个元素交换,将最大值“移出”堆。
    • 缩小堆的范围(排除已排序部分),对剩余部分重新调整为堆。
    • 重复上述过程,直到堆为空。

void AdjustHeap(Element A[], int k, int len) {
	A[0] = A[k];
	for(int i = 2 * k; i <= len; i = i * 2){
		if (i < len && A[i] < A[i + 1])
			i++;
		if (A[0] >= A[i]) break;
		else {
			A[k] = A[i];
			k = i;
		}
	}
	A[k] = A[0];
}

void BuildHeap(Element A[], int len) {
	for (int i = len / 2; i >= 1; i--) {
		AdjustHeap(A, i, len);
	}
}

void HeapSort(Element A[], int len) {
	BuildHeap(A, len);
	for (int i = len; i > 1; i--) {
		Swap(A[i], A[1]);
		AdjustHeap(A, 1, i - 1);
	}
}

当从大量数据中选取前k大或前k小的元素时,堆排序可以表现出较优的时间复杂度。


4. 时间复杂度
  • 建堆O(n)
  • 排序:每次调整堆的时间复杂度为 O(log n),需要调整 n-1 次。
  • 总时间复杂度O(n log n)

5. 空间复杂度
  • 原地排序O(1),只需常数级别的额外空间。

6. 稳定性
  • 不稳定:堆排序可能改变相等元素的相对顺序。可以以{1,2,2}将其调整为大顶堆为例。

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

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

相关文章

velocity模板引擎

文章目录 学习链接一. velocity简介1. velocity简介2. 应用场景3. velocity 组成结构 二. 快速入门1. 需求分析2. 步骤分析3. 代码实现3.1 创建工程3.2 引入坐标3.3 编写模板3.4 输出结果示例1编写模板测试 示例2 4. 运行原理 三. 基础语法3.1 VTL介绍3.2 VTL注释3.2.1 语法3.2…

13.第二阶段x64游戏实战-分析人物等级和升级经验

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;12.第二阶段x64游戏实战-远程调试 效果图&#xff1a; 如下图红框&#xff0c;…

六边形棋盘格(Hexagonal Grids)的坐标

1. 二位坐标转六边形棋盘的方式 1-1这是“波动式”的 这种就是把【方格子坐标】“左右各错开半个格子”做到的 具体来说有如下几种情况 具体到庙算平台上&#xff0c;是很巧妙的用一个4位整数&#xff0c;前两位为x、后两位为y来进行表示 附上计算距离的代码 def get_hex_di…

SICAR 标准 安全门锁操作箱 按钮和指示灯说明

1、安全门锁操作箱 2、按钮和指示灯说明 一、指示灯说明 红灯&#xff1a; 常亮&#xff1a;表示安全门已解锁&#xff1b;闪烁&#xff1a;表示安全门未复位&#xff1b;熄灭&#xff1a;表示安全门已复位。 黄灯&#xff1a; 常亮&#xff1a;表示处于维修模式。 绿灯&…

Day10【基于encoder- decoder架构实现新闻文本摘要的提取】

实现新闻文本摘要的提取 1. 概述与背景2.参数配置3.数据准备4.数据加载5.主程序6.预测评估7.生成效果8.总结 1. 概述与背景 新闻摘要生成是自然语言处理&#xff08;NLP&#xff09;中的一个重要任务&#xff0c;其目标是自动从长篇的新闻文章中提取出简洁、准确的摘要。近年来…

【blender小技巧】使用blender的Cats Blender Plugin插件将3D人物模型快速绑定或者修复为标准的人形骨骼

文章目录 前言绑定或者修复人形骨骼1、下载模型2、导入模型到blender中3、删除无用的相机和灯光3、导出模型并在unity中使用 专栏推荐完结 前言 有时候我们下载的3D人物模型&#xff0c;可能不带骨骼信息&#xff0c;或者带一些错乱的骨骼信息。这时候我们就可以使用blender将…

Linux——firewalld防火墙(笔记)

目录 一&#xff1a;Firewalld防火墙的概述 &#xff08;1&#xff09;firewalld简介 &#xff08;2&#xff09;firewalld&iptables的关系 &#xff08;3&#xff09;firewalld与iptables service的区别 1. ‌规则管理方式‌ 2. ‌默认策略与设计逻辑‌ 3. ‌配置文…

YOLO拓展-锚框(anchor box)详解

一.锚框&#xff08;anchor box&#xff09;概述 1.1什么是锚框 锚框就是一种进行预测的像素框&#xff0c;通过遍历输入图像上所有可能的像素框&#xff0c;然后选出正确的目标框&#xff0c;并对位置和大小进行调整就可以完成目标检测任务。 对于yolo锚框的建设须基于实际…

kubernetes》》k8s》》Service

Kubernetes 中的 Service 是用于暴露应用服务的核心抽象&#xff0c;为 Pod 提供稳定的访问入口、负载均衡和服务发现机制。Service在Kubernetes中代表了一组Pod的逻辑集合&#xff0c;通过创建一个Service&#xff0c;可以为一组具有相同功能的容器应用提供一个统一的入口地址…

已注册商标如何防止被不使用撤销!

近年来已注册商标被撤销越来越多&#xff0c;不乏著名企业或机构&#xff0c;普推知产商标老杨看到前一阵看到央视和百度等申请的商标也被申请撤销&#xff0c;连续三年不使用撤销也是正常的商标流程。 已注册商标被撤销普推老杨看到案例主要是集中在一些早期申请注册的好记的商…

管理与维护samba服务器

允许 Linux、Unix 系统与 Windows 系统之间进行文件和打印机共享&#xff0c;使得不同操作系统的用户能够方便地访问和共享资源&#xff0c;就像在同一局域网中的 Windows 计算机之间共享资源一样。 server01安装Samba服务器 [rootserver ~]# rpm -qa | grep samba [rootserver…

EAGLE代码研读+模型复现

要对代码下手了&#xff0c;加油(ง •_•)ง 作者在他们自己的设备上展现了推理的评估结果&#xff0c;受第三方评估认证&#xff0c;EAGLE为目前最快的投机方法&#xff08;虽然加速度是评估投机解码方法的主要指标&#xff0c;但其他点也值得关注。比如PLD和Lookahead无需额…

2024期刊综述论文 Knowledge Graphs and Semantic Web Tools in Cyber Threat Intelligence

发表在期刊Journal of Cybersecurity and Privacy上&#xff0c;专门讲知识图谱技术和语义Web工具在网络威胁情报领域的作用&#xff0c;还把本体和知识图谱放在相同的地位上讨论。 此处可以明确一点&#xff1a;本体和知识图谱都可以用于网络威胁情报的应用&#xff0c;当然也…

linux socket编程之udp(实现客户端和服务端消息的发送和接收)

目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…

计算机网络 实验四 静态路由的配置与应用

一、实验目的 掌握路由器基础工作原理及静态路由协议机制熟练使用华为ENSP网络模拟器进行拓扑设计与设备配置建立系统化的网络故障排除思维通过实践验证静态路由在中小型网络中的部署优势 二、实验环境 硬件配置&#xff1a;标准PC终端软件工具&#xff1a;华为企业网络模拟…

[每周一更]-(第140期):sync.Pool 使用详解:性能优化的利器

文章目录 一、什么是 sync.Pool&#xff1f;二、sync.Pool 的基本作用三、sync.Pool 的主要方法四、sync.Pool 的内部工作原理五、sync.Pool 适用场景六、使用示例示例 1&#xff1a;基本使用输出示例&#xff1a;示例 2&#xff1a;并发使用 七、一个基于 sync.Pool 的 **Benc…

3.QT-信号和槽|自定义槽函数|自定义信号}自定义的语法}带参数的信号和槽(C++)

信号和槽 Linux信号 Signal 系统内部的通知机制. 进程间通信的方式. 信号源&#xff1a;谁发的信号.信号的类型&#xff1a;哪种类别的信号信号的处理方式&#xff1a;注册信号处理函数&#xff0c;在信号被触发的时候自动调用执行. Qt中的信号和Linux中的信号&#xff0c;虽…

健康养生之道

在快节奏的现代生活中&#xff0c;健康养生不再是中老年人的专属话题&#xff0c;越来越多的人开始意识到&#xff0c;合理的养生方式是保持良好身体状态和生活质量的关键。​ 饮食养生是健康的基石。遵循 “食物多样、谷类为主” 的原则&#xff0c;保证每天摄入足够的蔬菜、…

Spark-SQL核心编程3

数据加载与保存 通用方式&#xff1a; SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API&#xff0c;根据不同的参数读取和保存不同格式的数据&#xff0c;SparkSQL 默认读取和保存的文件格式为parquet 数据加载方法&#xff1a; spark.read.lo…

TVM计算图分割--Collage

1 背景 为满足高效部署的需要&#xff0c;整合大量优化的tensor代数库和运行时做为后端成为必要之举。现在的深度学习后端可以分为两类&#xff1a;1&#xff09;算子库(operator kernel libraries)&#xff0c;为每个DL算子单独提供高效地低阶kernel实现。这些库一般也支持算…