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


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 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.rhkb.cn/news/487550.html

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

相关文章

顺序表(数据结构初阶)

文章目录 顺序表一&#xff1a;线性表1.1概念&#xff1a; 二&#xff1a;顺序表2.1概念与结构&#xff1a;2.2分类&#xff1a;2.2.1静态顺序表2.2.2动态顺序表 2.3动态顺序表的实现声明&#xff08;初始化&#xff09;检查空间容量尾插头插尾删头删查找指定位置之前插入数据指…

【Linux】磁盘结构和文件系统

文章目录 磁盘磁盘的物理结构LBA寻址法抽象管理分区化总结 磁盘 磁盘是计算机存储系统的核心部件之一&#xff0c;主要用于长期存储数据。磁盘的基本概念、物理结构和逻辑组织形式直接影响着其性能和使用效率。 下面的图片是一个磁盘&#xff1a; 磁盘打开之后的结构如下&…

NLP-中文分词

中文分词 1、中文分词研究背景及意义 和大部分西方语言不同&#xff0c;书面汉语的词语之间没有明显的空格标记&#xff0c;句子是以字串的形式出现。因此对中文进行处理的第一步就是进行自动分词&#xff0c;即将字串转变成词串。 比如“中国建筑业呈现新格局”分词后的词串…

【Golang】Go语言编程思想(六):Channel,第三节,使用Channel实现树的遍历

使用 Channel 实现树的遍历 tree 在此处简单回顾一下之前学过的二叉树遍历&#xff0c;首先新建一个名为 tree 的目录&#xff0c;并在其下对文件和子目录进行如下组织&#xff1a; 其中 node.go 存放的是 Node 的定义&#xff1a; package treeimport "fmt"type…

spring 源码分析

1 IOC 源码解析 BeanDefinition: bean的定义。里面会有beanClass、beanName、scope等属性 beanClass&#xff1a;通过Class.forName生成的Class 对象beanName&#xff1a;context.getBean(“account”)&#xff0c;acount就是beanNamescope: 作用区分单例bean、原型bean Bea…

快速搭建SpringBoot3+Vue3+ElementPlus管理系统

快速搭建SpringBoot3Vue3管理系统 前端项目搭建&#xff08;默认开发环境&#xff1a;node20,Jdk17&#xff09;创建项目并下载依赖--执行以下命令 前端项目搭建&#xff08;默认开发环境&#xff1a;node20,Jdk17&#xff09; 创建项目并下载依赖–执行以下命令 创建项目 y…

基于Hadoop大数据音乐推荐系统的设计与实现

摘 要 各种主流的音乐平台都为用户提供了的大量的音乐&#xff0c;让他们时刻都能沉浸在音乐的海洋之中。然而&#xff0c;过多的音乐往往使用户眼花缭乱&#xff0c;很难发现他们真正所需要的。一套优秀的推荐系统&#xff0c;可以很好地解决这个问题&#xff0c;既能帮助用户…

IDEA遇到EasyConnect中的网络资源无法访问的问题

IDEA遇到EasyConnect中的网络资源无法访问的问题 摘要由CSDN通过智能技术生成 点击编辑IDEA的 启动配置&#xff0c;然后在启动器下面的新增一个请求参数然后重新启动项目&#xff0c; java.net.preferIPv4Stack true IDEA就能连接到EasyConnect代理的网络服务 wanshanyu_ 关…

IP研究 | 大数据洞察黄油小熊的爆火之路

一只来自泰国的小熊在国内红成了顶流。 今年&#xff0c;黄油小熊以烘焙店“打工人”的超萌形象迅速走红&#xff0c;2个月内火遍中国的社交媒体&#xff0c;泰国门店挤满飘洋过海求合影的中国粉丝&#xff0c;根据数说故事全网大数据洞察&#xff0c;黄油小熊2024年度的线上声…

分数求和ᅟᅠ        ‌‍‎‏

分数求和 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入n个分数并对他们求和&#xff0c;并用最简形式表示。所谓最简形式是指&#xff1a;分子分母的最大公约数为1&#xff1b;若最终结果的分母为…

5G中的随机接入过程可以不用收RAR?

有朋友提到了一种不用接收RAR的RA过程&#xff0c;问这个是怎么回事。其实在刚刚写过的LTM cell switch篇章中就有提到&#xff0c;这里把所有相关的内容整理如下。 在RACH-less LTM场景&#xff0c;在进行LTM cell switch之前就要先知道target cell的TA信息&#xff0c;进而才…

Ubuntu安装grafana

需求背景&#xff1a;管理服务器&#xff0c;并在线预警&#xff0c;通知 需求目的&#xff1a; 及时获取服务器状态 技能要求&#xff1a; 1、ubuntu 2、grafana 3、prometheus 4、https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2F%2Fimg…

vue3获取、设置元素高度

前言 在web端常见的需求场景中&#xff0c;会经常遇到table表格需要根据页面可视区域使高度自适应的情况。 傻喵(作者本人)昨天在尝试使用vue3实现这个需求时&#xff0c;看了几篇网上写的回答&#xff0c;都不太全面&#xff0c;所以干脆自己写个总结吧.(第一次写&#xff0c…

美畅物联丨观看实时视频对服务器带宽有什么要求?

​随着互联网的迅猛发展&#xff0c;实时视频观看已然成为人们日常生活中不可或缺的一部分。不管是视频会议、在线教育&#xff0c;还是在线娱乐&#xff0c;实时视频都起到了极为重要的作用。不过&#xff0c;实时视频的流畅播放对服务器的带宽有着极高的要求。本文将深入探究…

MongoDB-固定集合(Capped Collection)

在 MongoDB 中&#xff0c;固定集合&#xff08;Capped Collection&#xff09;是一种具有特殊属性的集合。固定集合具有一个固定的最大大小&#xff0c;并且一旦达到该大小时&#xff0c;最早插入的文档将会被自动删除&#xff0c;以便为新的文档腾出空间。固定集合的这种特性…

EasyExcel注解使用

上接《Springboot下导入导出excel》&#xff0c;本篇详细介绍 EasyExcel 注解使用。 1. ExcelProperty value&#xff1a;指定写入的列头&#xff0c;如果不指定则使用成员变量的名字作为列头&#xff1b;如果要设置复杂的头&#xff0c;可以为value指定多个值order&#xff…

yolo-V3

1、研究背景及意义 1&#xff09;对yolo进行创新&#xff0c;准确度更高。 2、创新点 1&#xff09;主要是更换了主干网络&#xff0c;使用了多尺度特征融合。 3、网络结构 yolo-V3以Darket-Net-53为主干网络。网络输入一张尺寸为416416的图片&#xff0c;经过多层卷积分别…

零基础如何使用ChatGPT快速学习Python

引言 AI编程时代来临&#xff0c;没有编程基础可以快速上车享受时代的红利吗&#xff1f;答案是肯定的。本文旨在介绍零基础如何利用ChatGPT快速学习Python编程语言&#xff0c;开启AI编程之路。解决的问题包括&#xff1a;传统学习方式效率低、缺乏互动性以及学习资源质量参差…

重生之我在异世界学编程之C语言:枚举联合篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文枚举&#xff08;Enum&#xff0…

MYSQL索引的分类和创建

目录 1、聚簇索引和非聚簇索引 tips&#xff1a; 小问题&#xff1a;主键为什么建议使用自增id? 2、普通索引 &#xff08;常规索引&#xff09;(normal) 3、唯一索引&#xff08;UNIQUE &#xff09; 唯一索引和主键的区别&#xff1a; 唯一约束和唯一索引的区别&#…