【C++】选择排 序算法分析与扩展

news2024/12/12 23:49:00

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯代码回顾
  • 💯选择排序的算法流程
  • 💯代码详解
    • 外层循环
    • 初始化最小值
    • 内层循环
    • 比较与更新
    • 元素交换
  • 💯选择排序的特性
    • 时间复杂度
    • 空间复杂度
    • 稳定性
  • 💯优化与改进
    • 减少不必要的交换
    • 选择更高效的排序算法
    • 结合多种算法
  • 💯拓展:排序算法分类
    • 按稳定性分类
    • 按时间复杂度分类
    • 按空间复杂度分类
  • 💯小结


在这里插入图片描述


💯前言

  • 在这篇文章中,我们系统性地解析了选择排序(Selection Sort)算法,通过审视其具体实现代码,阐释其原理与运行机制。我们还从理论与实践的角度深入探讨其性能特性优化方法,并扩展至其他相关排序算法的分析框架,旨在为读者提供一幅全面的排序算法图景
    C++ 参考手册
    在这里插入图片描述

💯代码回顾

以下为选择排序算法的核心代码实现:

#include <iostream>
using namespace std;
int main()
{
	int cards[13] = {7, 5, 1, 2, 3, 6, 8, 11, 9, 12, 10, 4, 13};
	for (int i = 0; i < 13; i++)
	{
	    int min = cards[i], min_id = i;
	    for (int j = i + 1; j < 13; j++)
	        if (cards[j] < min)
	        {
	            min = cards[j];
	            min_id = j;
	        }
	    cards[min_id] = cards[i];
	    cards[i] = min;
	}
	for(int i = 0; i < sizeof(cards)/sizeof(cards[0]); i++)
	{
		cout << cards[i] << " ";
	}
	return 0;
}

在这里插入图片描述

这段代码实现了对数组 cards 的升序排序,采用了选择排序的经典方法:在每轮迭代中,从未排序的子数组中提取最小值,并将其交换到已排序部分的末尾。以下我们将逐步剖析该算法的逻辑细节。


💯选择排序的算法流程

在这里插入图片描述
选择排序的逻辑可分为三个主要步骤:

  1. 外层循环(控制轮次)

    • 遍历整个数组,将当前轮次的最小值放置到其正确位置。
    • 每次循环结束后,未排序部分的元素减少一个。
  2. 内层循环(寻找最小值)

    • 在当前未排序部分,逐一比较元素,记录最小值及其索引。
  3. 交换元素

    • 将找到的最小值与未排序部分的第一个元素交换,完成一次选择。

这种方法直观且易于实现,但因其高时间复杂度,效率较低,主要适用于小型数据集的排序任务。


💯代码详解

以下为上述代码的详细分解与分析:
在这里插入图片描述


外层循环

在这里插入图片描述

for (int i = 0; i < 13; i++)
  • 功能:控制排序的轮次,逐步缩小未排序部分的范围。
  • 解释
    • 变量 i 指示当前未排序部分的起点。
    • i=0i=12,外层循环运行 13 轮,完成整个数组的排序。
  • 作用:每轮选择排序的目标是将未排序部分的最小值放置在索引 i

初始化最小值

在这里插入图片描述

int min = cards[i], min_id = i;
  • 功能:假设当前未排序部分的第一个元素为最小值。
  • 解释
    • min 保存当前已知的最小值。
    • min_id 记录当前最小值的位置索引,以便后续交换。

内层循环

在这里插入图片描述

for (int j = i + 1; j < 13; j++)
  • 功能:遍历未排序部分的其余元素,寻找实际最小值。
  • 解释
    • j 为内层循环索引,从未排序部分的第二个元素开始。
    • 内层循环遍历结束时,minmin_id 对应未排序部分的最小值及其索引。

比较与更新

在这里插入图片描述

if (cards[j] < min)
{
    min = cards[j];
    min_id = j;
}
  • 功能:在比较中动态更新最小值。
  • 解释
    • 如果发现当前元素 cards[j] 小于当前最小值 min,则更新 minmin_id
    • 内层循环结束后,min 保存真正的最小值。

元素交换

在这里插入图片描述

cards[min_id] = cards[i];
cards[i] = min;
  • 功能:将找到的最小值放置到未排序部分的起点。
  • 解释
    • 通过交换操作,完成当前轮次的选择排序。
    • 每轮交换后,已排序部分扩展一位。

💯选择排序的特性

在这里插入图片描述


时间复杂度

在这里插入图片描述

  • 最好情况:O(n²)
  • 最坏情况:O(n²)
  • 平均情况:O(n²)
  • 分析
    • 外层循环执行 n 次,内层循环的执行次数依次递减,总复杂度为 ( T(n) = \frac{n(n-1)}{2} \approx O(n^2) )。

空间复杂度

在这里插入图片描述

  • O ( 1 ) O(1) O(1)
  • 原因:选择排序是原地排序算法,仅需常量级别的辅助空间。

稳定性

  • 不稳定
  • 原因:在交换操作中,相同元素的相对顺序可能被破坏。

💯优化与改进

尽管选择排序直观易懂,但其效率在大多数情况下并不理想。以下为几种可行的优化与替代方案:
在这里插入图片描述


减少不必要的交换

在这里插入图片描述
当前代码的每轮都会执行交换操作,优化后的代码可先判断是否有必要交换:

if (min_id != i)
{
    cards[min_id] = cards[i];
    cards[i] = min;
}

此改动避免了当最小值已在正确位置时的无效交换。


选择更高效的排序算法

在这里插入图片描述
在实际应用中,以下算法通常表现优于选择排序:

  • 快速排序(Quick Sort):分治法,平均时间复杂度 O(n log n)。
  • 归并排序(Merge Sort):稳定排序,适用于大规模数据集。
  • 堆排序(Heap Sort):适用于需要优先级的排序场景。

结合多种算法

在这里插入图片描述
现代排序算法库(如 Python 的 Timsort)通过结合多种算法实现性能优化,在小规模数据上使用插入排序,在大规模数据上使用归并排序。


💯拓展:排序算法分类

在这里插入图片描述


按稳定性分类

  • 稳定排序:冒泡排序、归并排序。
  • 不稳定排序:快速排序、选择排序。
    在这里插入图片描述

按时间复杂度分类

  • O(n²):冒泡排序、插入排序、选择排序。
  • O(n log n):快速排序、归并排序、堆排序。
    在这里插入图片描述

按空间复杂度分类

  • 原地排序:选择排序、快速排序。
  • 非原地排序:归并排序。
    在这里插入图片描述

💯小结

  • 在这里插入图片描述
    本文对选择排序算法的实现、特性及优化进行了系统性分析,并扩展至更高效的排序算法及其应用。选择排序因其逻辑直观实现简洁,适合教学与小规模任务;但其 O(n²) 的时间复杂度限制了其在大规模数据上的应用。
    通过深入理解选择排序的实现,读者不仅能掌握其基本原理,还可以进一步分析不同排序算法的适用场景,从而根据实际需求选择最优的算法解决方案

在这里插入图片描述


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

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

相关文章

3D 生成重建024-LGM第一个开源的3D生成大模型!

3D 生成重建024-LGM第一个开源的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验效果 0 论文工作 这篇论文介绍了一种名为LGM&#xff08;大型多视角高斯模型&#xff09;的新方法&#xff0c;用于从单视角图像或文本提示生成高分辨率的三维内容。该方法的核心思想是双重的…

微信 创建小程序码-有数量限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …

日志基础示例python和c++

文章目录 0. 引言1. python2. c 0. 引言 本文主要记录python版本和c版本常用的日志基础示例。 1. python python版本常用的是logging库&#xff0c;结合colorlog库&#xff0c;可根据不同日志级别打印不同颜色的日志&#xff0c;为了便于分析问题&#xff0c;还添加了日志保…

泷羽sec学习打卡-brupsuite4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-proxy proxyInterceptHTTP history/WebSocket history&#xff08;历史记录&a…

喜报!极限科技(INFINI Labs)通过国家高新技术企业认定

2024 年 10 月 29 日&#xff0c;国家高新技术企业认定管理工作网公示了北京市认定机构 2024 年认定报备的第一批高新技术企业备案名单&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司 顺利通过本次高新技术企业评审&#xff0c;并获得 国家级“高新技术企业”认…

STM32 USART串口通信 综合练习

USART&#xff08;通用同步/异步串行接收/发送器&#xff09;串口通信具有以下特点&#xff1a; 全双工操作&#xff1a;设备之间可以同时进行数据的发送和接收。异步通信&#xff1a;不需要共同的时钟信号&#xff0c;双方设备有各自的时钟。单端信号&#xff1a;使用一根线传…

Linux - 进程等待和进程替换

进程等待 前面我们了解了如果父进程没有回收子进程, 那么当子进程接收后, 就会一直处于僵尸状态, 导致内存泄漏, 那么我们如何让父进程来回收子进程的资源. waitpid 我们可以通过 Linux 提供的系统调用函数 wait 系列函数来等待子进程死亡, 并回收资源. #include <sys/t…

虚拟主机怎么选哪家的性价比高

选择虚拟主机不能只看价格&#xff0c;还要看质量和服务&#xff0c;稳定快速的虚拟主机再加上优质的售后服务&#xff0c;才可令网站顺利运行&#xff0c;站长才无后顾之忧。 选虚拟主机或云服务器还是要选大牌主机商的产品比较好&#xff0c;质量和服务更有保障&#xff0c;例…

英文论文翻译成中文,怎样翻译更地道?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 最近学员群有同学问&#xff0c;英文论文翻译成中文的解决方案—“DeepL翻译出来的内容总是有点别扭&#xff0c;ChatGPT能翻译的地道一些吗&#xff1f;”。 正好有位刚加入的…

40分钟学 Go 语言高并发:服务监控与追踪

服务监控与追踪 一、知识要点总览 模块核心内容技术选型难度监控指标请求量、响应时间、错误率、资源使用Prometheus Grafana中链路追踪分布式调用链、性能瓶颈分析Jaeger, OpenTelemetry高日志处理日志收集、分析、存储ELK Stack中告警系统告警规则、通知渠道、告警分级Ale…

【Unity高级】如何实现粒子系统的间歇式喷射

先看下要最终实现的效果&#xff1a; 代码如下&#xff1a; using UnityEngine; using System.Collections;public class ParticleBurstController : MonoBehaviour {private ParticleSystem _particleSystem; // 获取粒子系统public float burstDuration 2f; // 每次…

clipchamp制作视频文字转语音音频

一.准备工作&#xff1a; 1.在浏览器打开 https://app.clipchamp.com/首次打开需要登录&#xff0c;未登录用户注册登录 2.点击右上角头像到Settings页面&#xff0c;点击Language切换到中文&#xff08;英文水平好的可以忽略此步骤&#xff09;因中文英文界面有微小差异&…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

三菱伺服通过MR Configurator2进行的试运行模式

(1)试运行模式 (a)JOG运转 可以不使用伺服系统控制器执行J0G运行。请在解除强制停止的状态下使用。无论伺服0N/伺服OFF或伺服系统控制器有无连接均可使用。 通过MR Configurator2的J0G运行画面进行操作。 1)运行模式 2)运行方法 "“仅在长按正转、反转按钮中运行”的复选框…

Sqoop导入数据(mysql---->>hive)

目录 数据传输流程脚本报错和异常说明1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf2. 数据导入hive后显示NULL 数据传输流程 mysql---->>hdfs---->>hive 数据从mysql表中取出&#xff0c;放到hdfs上&#xff08;由targ…

Flask返回中文Unicode编码(乱码)解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C++AVL树】枝叶间的旋律:AVL树的和谐之道

公主请阅 1.AVL树的概念2.AVL树的插入AVL树插入一个值的大概过程平衡因子更新更新原则更新停止条件 3.AVL树的右转旋转的原则右单旋 4.AVL树的左旋左单旋 5.AVL树的左右双旋6.AVL树的右左双旋7.AVL树的模拟实现 1.AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AV…

深入理解C#的TCPIP通信机制

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;在分布式系统和实时数据交换应用中&#xff0c;C#作为一种现代面向对象编程语言&#xff0c;利用其***命名空间下的Socket类&#xff0c;提供强大的TCP/IP通信功能。本文将探讨C#中TCP/IP通信的基本概念、使用方…

基于yolov8的SAR影像目标检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的SAR影像目标检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的SAR影像目标…

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…