如何在 C 语言中进行选择排序?
🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。
文章目录
- 如何在 C 语言中进行选择排序
- 一、选择排序的基本思想
- 二、选择排序的算法步骤
- 三、选择排序的 C 语言实现
- 四、选择排序的时间复杂度和空间复杂度分析
- (一)时间复杂度
- (二)空间复杂度
- 五、选择排序的稳定性
- 六、选择排序的适用场景
- 七、选择排序与其他排序算法的比较
- (一)与冒泡排序的比较
- (二)与插入排序的比较
- (三)与快速排序的比较
- 八、示例分析
- 九、优化思路
- (一)减少交换次数
- (二)利用已排序部分的信息
- 十、总结
如何在 C 语言中进行选择排序
选择排序(Selection Sort)是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
一、选择排序的基本思想
- 遍历整个数组,找出最小的元素。
- 将最小的元素与数组的第一个元素交换位置。
- 在剩余的未排序元素中重复上述步骤,直到整个数组都被排序。
二、选择排序的算法步骤
以下是选择排序的详细步骤:
假设要对数组 arr[]
进行排序,数组的长度为 n
:
- 从数组的第一个元素开始,即
i = 0
。 - 对于每个
i
,从i + 1
到n - 1
中找到最小的元素,并记录其索引min_index
。 - 如果
min_index
不等于i
,则交换arr[i]
和arr[min_index]
。 - 增加
i
,重复步骤 2 和 3,直到i = n - 2
。
三、选择排序的 C 语言实现
#include <stdio.h>// 交换两个元素的值
void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}// 选择排序函数
void selectionSort(int arr[], int n) {int i, j, min_index;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++)if (arr[j] < arr[min_index])min_index = j;if (min_index!= i)swap(&arr[i], &arr[min_index]);}
}// 打印数组函数
void printArray(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}// 测试案例
int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);printf("排序前的数组为: ");printArray(arr, n);selectionSort(arr, n);printf("排序后的数组为: ");printArray(arr, n);return 0;
}
在上述代码中,我们首先定义了一个 swap
函数用于交换两个元素的值。
selectionSort
函数实现了选择排序的逻辑。外层循环控制排序的轮数,内层循环用于在每一轮中找到最小的元素。
printArray
函数用于打印数组的元素。
在 main
函数中,我们创建了一个待排序的数组,并调用相应的函数进行排序和打印。
四、选择排序的时间复杂度和空间复杂度分析
(一)时间复杂度
选择排序的平均时间复杂度和最坏时间复杂度都为 O(n^2)
。这是因为无论数组的初始状态如何,对于每个元素都需要进行比较和交换操作,总共需要进行 n - 1
轮比较和交换,每一轮比较和交换的操作数量都与数组的长度 n
成正比。
(二)空间复杂度
选择排序的空间复杂度为 O(1)
。因为它只在交换元素时使用了固定的额外空间,而不需要额外的数组或其他数据结构来存储数据。
五、选择排序的稳定性
选择排序是一种不稳定的排序算法。这是因为在选择最小元素并与当前位置交换时,如果有两个相同的元素,它们的相对顺序可能会发生改变。
例如,对于数组 [5, 5', 2]
,第一次选择最小元素 2
并与第一个位置的 5
交换,得到 [2, 5', 5]
,两个 5
的相对顺序发生了变化。
六、选择排序的适用场景
选择排序适用于小型数据集或者对算法的简单性要求较高的场景。由于其时间复杂度较高,在处理大型数据集时,性能通常不如其他更高效的排序算法,如快速排序、归并排序等。
七、选择排序与其他排序算法的比较
(一)与冒泡排序的比较
选择排序和冒泡排序都是简单的排序算法,它们的时间复杂度都为 O(n^2)
。然而,在每一轮的操作中,冒泡排序需要进行多次相邻元素的比较和交换,而选择排序只需要进行一次最小元素的选择和交换。因此,在通常情况下,选择排序的性能略优于冒泡排序。
(二)与插入排序的比较
插入排序在对于近乎有序的数组时,性能较好,其平均时间复杂度可以接近 O(n)
。而选择排序无论数组的初始状态如何,时间复杂度都为 O(n^2)
。因此,在数组近乎有序的情况下,插入排序更优。
(三)与快速排序的比较
快速排序的平均时间复杂度为 O(nlogn)
,是一种效率很高的排序算法。与选择排序相比,快速排序在处理大型数据集时具有明显的优势。
八、示例分析
让我们通过一个具体的示例来详细分析选择排序的过程。
假设有数组 [9, 5, 7, 2, 6]
第一轮:
- 初始状态:
[9, 5, 7, 2, 6]
- 首先假设第一个元素
9
是最小的,然后从第二个元素开始比较。 - 经过比较,发现
2
是最小的,所以将2
与9
交换位置。 - 第一轮结束后,数组变为
[2, 5, 7, 9, 6]
第二轮:
- 此时从第二个元素开始,假设
5
是最小的。 - 比较剩余元素,发现没有比
5
更小的,所以位置不变。 - 第二轮结束后,数组仍为
[2, 5, 7, 9, 6]
第三轮:
- 从第三个元素开始,假设
7
是最小的。 - 比较剩余元素,发现
6
更小,所以将6
与7
交换位置。 - 第三轮结束后,数组变为
[2, 5, 6, 9, 7]
第四轮:
- 从第四个元素开始,假设
9
是最小的。 - 比较剩余元素,发现
7
更小,所以将7
与9
交换位置。 - 第四轮结束后,数组变为
[2, 5, 6, 7, 9]
,排序完成。
通过这个示例,我们可以清晰地看到选择排序每一轮的操作过程以及如何逐步将数组排序。
九、优化思路
虽然选择排序的基本算法已经比较简单直接,但在某些情况下,仍然可以考虑一些优化思路:
(一)减少交换次数
在找到最小元素的索引后,先不立即进行交换,而是在一轮比较结束后,如果最小元素的索引与当前位置不同,再进行一次交换。这样可以在一定程度上减少交换的次数,特别是在数组中元素重复较多的情况下。
(二)利用已排序部分的信息
在后续的轮次中,可以利用已经排序好的部分,缩小搜索最小元素的范围。但这种优化在选择排序中效果可能不太显著,因为选择排序的核心思想是每次选择未排序部分的最小元素。
十、总结
选择排序是一种简单但效率相对较低的排序算法。它的优点是实现简单,易于理解,空间复杂度低。缺点是时间复杂度较高,在处理大规模数据时性能不佳。在实际应用中,应根据具体情况选择合适的排序算法。如果数据量较小,或者对算法的简单性要求较高,选择排序可以是一个可行的选择。但对于大规模数据的排序,通常会优先考虑更高效的排序算法,如快速排序、归并排序等。
🎉相关推荐
- 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。
- 🍅博客首页-关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
- 📙CSDN专栏-C语言修炼
- 📙技术社区-墨松科技
相关文章:

如何在 C 语言中进行选择排序?
🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…...

开源浏览器引擎对比与适用场景:WebKit、Chrome、Gecko
WebKit与Chrome的Blink引擎对比 起源与关系: WebKit最初由苹果公司开发,用于Safari浏览器。后来,WebKit逐渐成为一个独立的开源项目,被多个浏览器厂商采用。Blink是Google基于WebKit项目分支出来的一个浏览器引擎,用于…...

DNF客户端使用
客户端使用 1、下载客户端2、配置网关连接到服务器2.1 网关设置参数:2.2 点击连接网关2.3 点击“参数设置内容立即生效” 3、使用网关生成登陆器3.1 登陆器参数设置3.2 点击增加3.3 复制网关的通信密钥,点击生成登陆器 4、复制替换相关文件4.1 复制登陆器到客户端文…...

打包时提示:Missing Gradle Project Information.或者在加载gradle时出错
1.Android打包弹出错误提示框:missing gradle project information. please check if the IDE successfully synchronized its state with the Gradble project model. 2.加载gradle出错:修复报错后 File -> Sync Project with Gradle Files...

基于前馈神经网络 FNN 实现股票单变量时间序列预测(PyTorch版)
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...

Scikit Learn - 建模手册(02)--- 数据表示、估算器
Scikit Learn - 数据表示 文章目录 一、说明二、数据表格2.1 数据作为特征矩阵2.2 数据作为目标数组 三、什么是 Estimator API四、Estimator API 的使用五、指导原则六、使用 Estimator API 的步骤七、监督学习示例八、无监督学习示例 一、说明 众所周知,机器学习…...

【鸿蒙学习笔记】通过用户首选项实现数据持久化
官方文档:通过用户首选项实现数据持久化 目录标题 使用场景第1步:源码第2步:启动模拟器第3步:启动entry第6步:操作样例2 使用场景 Preferences会将该数据缓存在内存中,当用户读取的时候,能够快…...

LabVIEW航空发动机试验器数据监测分析
1. 概述 为了适应航空发动机试验器的智能化发展,本文基于图形化编程工具LabVIEW为平台,结合航空发动机试验器原有的软硬件设备,设计开发了一套数据监测分析功能模块。主要阐述了数据监测分析功能设计中的设计思路和主要功能,以及…...

快速上手:前后端分离开发(Vue+Element+Spring Boot+MyBatis+MySQL)
文章目录 前言项目简介环境准备第一步:初始化前端项目登录页面任务管理页面 第二步:初始化后端项目数据库配置数据库表结构实体类和Mapper服务层和控制器 第三步:连接前后端总结 🎉欢迎来到架构设计专栏~探索Java中的静态变量与实…...

产品推荐| 长江存储eMMC嵌入式储存 YMTC EC230
产品详情 EC230是基于长江存储晶栈Xtacking3.0三维闪存架构打造的新一代eMMC 5.1嵌入式存储产品。EC230的最大顺序读取速度达330MB/s,支持动态SLC缓存,为终端设备提供稳定高性能;支持自动后台/自动节能等操作,减少设备延迟&#…...

【Linux】IP地址与主机名
文章目录 1.IP地址2.特殊IP地址3.主机名4.域名解析 1.IP地址 每一台联网的电脑都会有一个地址,用于和其它计算机进行通讯 IP地址主要有2个版本,V4版本和V6版本 IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字,如192.168.…...

ros2--colcon
colcon ros2的编译工具,用于编译ros2项目; 需要在工作空间,也就是src上一级目录colcon build; 很明显colcon作为构建工具,通过调用CMake、Python setuptools完成构建。 小鱼文档 构建参数 --packages-select 仅构…...

PyCharm 2023.3.2 关闭时一直显示正在关闭项目
文章目录 一、问题描述二、问题原因三、解决方法 一、问题描述 PyCharm 2023.3.2 关闭时一直显示正在关闭项目 二、问题原因 因为PyCharm还没有加载完索引导致的 三、解决方法 方法一: 先使用任务管理器强制关闭,下次关闭时注意要等待PyCharm加载完索…...

VS2022 git拉取/推送代码错误
第一步:打开VS2022 第二步:工具->选项->源代码管理->Git 全局设置 第三步:加密网络提供程序设置为:OpenSSL 完结:...

【Vue】vue3中使用swipe竖直方向上滚动
安装 npm install swipe使用 import swiper/css; import swiper/css/mousewheel; import { Swiper, SwiperSlide } from swiper/vue; import { Mousewheel } from swiper/modules;containerHeight 是容器的高度,一定要设置竖直方向上滚动高度,不然会非…...

搭建基于 ChatGPT 的问答系统
搭建基于 ChatGPT 的问答系统 📣1.简介📣2.模型,范式和 token📣3.检查输入-分类📣4.检查输入-监督📣5.思维链推理📣6.提示链📣7.检查输入📣8.评估(端到端系统…...

C++运行时类型识别
目录 C运行时类型识别A.What(什么是运行时类型识别RTTI)B.Why(为什么需要RTTI)C.dynamic_cast运算符Why(dynamic_cast运算符的作用)How(如何使用dynamic_cast运算符) D.typeid运算符…...

在微信上怎么制作一个商城链接
在这个快节奏的时代,每一分每一秒都显得尤为珍贵。随着移动互联网的飞速发展,我们的生活方式正经历着前所未有的变革,其中,微信作为国民级社交应用,早已超越了简单的聊天功能,成为了集社交、支付、生活服务…...

怎么搭建微信商城
在当今这个数字化时代,微信已成为人们日常生活中不可或缺的一部分,它不仅改变了我们的社交方式,更引领了商业营销的新潮流。微信商城作为微信生态内的一个重要组成部分,正以其独特的优势助力商家们实现线上销售的突破。本文将带您…...

【每日一练】python的类.对象.成员.行为.方法传参综合实例(保姆式教学)
运行结果: 本节课程内容:类的使用 1.掌握类的定义和使用方法 2.掌握类的成员的方法使用 3.掌握self关键字的作用 4.定义在类里的函数是类的一种行为,叫方法 5.带传参的行为使用方法 类基本分两部分组成:1.属性,2.方法 类的使用语法…...

Windows 如何打开表情符号面板并使用?
打开面板的方法 想要打开表情符号面板其实非常简单,只需要使用快捷键“Win.”或者“Win;”即可。按下快捷键之后就可以调用出表情符号键盘。 在面板中我们可以看见顶部的三个选项,分别是表情符号、颜文字和符号,表情符号就是上面…...

编程语言里的双斜杠:深入解析其神秘面纱
编程语言里的双斜杠:深入解析其神秘面纱 在编程语言的广阔天地中,双斜杠(//)这一看似简单的符号,实则蕴含着丰富的内涵和用途。它既是注释的标识,又是特定语法结构的组成部分,甚至在某些情况下…...

【架构-20】死锁
什么是死锁? 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: (1)互斥条件(Mutual Exclusion):至少有一个资源是非共享…...

Chat2DB:AI引领下的全链路数据库管理新纪元
一、引言 随着数据驱动决策成为现代企业和组织的核心竞争力,数据库管理工具的重要性日益凸显。然而,传统的数据库管理工具往往存在操作复杂、功能单一、不支持多类型数据库管理等问题,限制了数据的有效利用。为了打破这一局面,Ch…...

数据库的学习(5)
题目: 1、新增员工表emp和部门表dept create table dept (deptl int,dept name varchar(11)) charsetutf8; create table emp (sid int,name varchar(11),age int,worktime start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (…...

v-bind指令——03
v-bind 指令详解: 1 、这个指令是干嘛的? 可以让html标签的某个属性的值产生动态的效果 2、v-bind指令的语法格式:<HTML 标签 v-bind : 参数 “表达式”> </HTML> 3、v-bind指令的编译原理: 编译前:…...

RedisTemplate使用
文章目录 RedisTemplate使用String类型Hash类型List类型Set类型Zset类型 RedisTemplate使用 String类型 Overridepublic void testString() {// t11();String key "k1";String currentNum;// 用法1:key是否存在Boolean value client.hasKey(key);log.i…...

文献解读-多组学-第十八期|《整合 WES 和 RNA-Seq 数据以进行短变异发现》
关键词:多组学;基因测序;变异检测; 文献简介 标题(英文):Integrating WES and RNA-Seq Data For Short Variant Discovery标题(中文):整合 WES 和 RNA-Seq 数…...

【漏洞复现】锐捷校园网自助服务系统 任意文件读取
声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 锐捷校园网自助服务系统是用于学校网络管理的一个平台,login_judge.jsf接口存在任意文件读取…...