C#基础(15)选择排序

前言 

上一节中我们已经学习了第一个算法:冒泡算法,相信你也有足够的自信继续学习更多的算法。

今天我们就来讲解又一个排序相关的算法:选择排序。

时间复杂度

在进行今天的排序算法讲解之前,我们先补充一个知识点:时间复杂度。

这是数据结构中一个比较重要的知识点,它用来衡量解决问题的算法所需的时间成本,它描述了算法所需操作数量随输入大小的增长速度。

常见的时间复杂度有:

  1. 常数时间复杂度(O(1)):算法的运行时间不随输入规模增加而增加,无论输入的大小如何,算法的运行时间都保持恒定。例如,访问数组中的一个元素。

  2. 线性时间复杂度(O(n)):算法的运行时间与输入规模成正比。例如,循环遍历一个长度为n的数组。

  3. 对数时间复杂度(O(log n)):算法的运行时间与输入规模的对数成正比。例如,二分查找算法。

  4. 平方时间复杂度(O(n^2)):算法的运行时间与输入规模的平方成正比。例如,两个循环嵌套的算法。

  5. 指数时间复杂度(O(2^n)):算法的运行时间与输入规模的指数成正比。例如,求解旅行商问题的穷举算法。

至于怎么计算时间复杂度,就是一个比较复杂的问题了,博主这里不专门拿篇幅来讲,感兴趣的可以戳这篇文章,在博主看来比较通俗易懂。

了解了时间复杂度,你也会知道为什么上一篇文章做的优化会有人说在时间复杂度上并没有更多的作用。

选择排序基本原理

  • 新建中间商(用于存储变量)
  • 依次比较
  • 找出极值(极大或者极小)
  • 放入目标位置

如果觉得不太清楚的话,可以看图像延时,相信你很快就能get到选择排序的特点。

我相信你现在已经清楚了选择排序的基本原理,现在就让博主带着你用c#来实现一下。

代码实现

首先我们要做的第一步,就是声明一个中间商(临时变量),来记录索引,用于我们和后面的值依次比较。

然后我们通过循环,来让他完成依次比较,来确定本次比较的极值所在的下标,我们通过打印来进行验证。

代码如下:

using System;class Program
{static void Main(string[] args){int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };//每一轮开始,默认索引值是极值int index = 0;for (int i = 0; i < arr.Length; i++){//找出这一轮的极值if (arr[index] < arr[i])//>升序,<降序index = i;}Console.WriteLine(arr[index]);}
}

 我们找出了极致后,就要把值放到它应该待的位置:

using System;class Program
{static void Main(string[] args){int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };//每一轮开始,默认索引值是极值int index = 0;for (int i = 0; i < arr.Length; i++){//找出这一轮的极值if (arr[index] >arr[i])//>升序,<降序index = i;}if(index != 0)//是因为数组是从0开始索引的{int temp = arr[index];arr[index] = arr[0];arr[0] = temp;}for (int i = 0; i < arr.Length; i++){Console.Write(" " + arr[i]);}}
}

当然,博主也有另一个版本,会在后续给大家一并展示,这个是从头开始排序,另一个是从末尾开始排序。

因为不太符合我的示意图,怕你混淆了,所以我们先讲示意图的方法。

我们完成第一次排序后,只用进行j轮就可以完成排序,j为数组的长度。

加一个循环嘛,不过要注意,排序过的我们就不排序了,这个就不废话了,冒泡排序中也有一样的道理:

具体看注释,如果有疑问可以私信博主。

using System;class Program
{static void Main(string[] args){int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };for (int j = 0;j<arr.Length;j++){//每一轮开始,默认索引值是极值int index = j;//从j开始索引for (int i = j; i < arr.Length; i++)//j是排除已定位的元素{//找出这一轮的极值if (arr[index] > arr[i])//>升序,<降序index = i;}if (index != j)//从j开始索引的,所以如果是j其实就不用变位置{int temp = arr[index];arr[index] = arr[j];arr[j] = temp;}for (int i = 0; i < arr.Length; i++){Console.Write(" " + arr[i]);}Console.WriteLine();}}
}

当然,博主这里也给你提供另一种倒着排序的代码,但是就不进行过多讲解了。

using System;class Program
{static void Main(string[] args){int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };for (int j = 0;j<arr.Length;j++){//每一轮开始,默认索引值是极值int index = 0;for (int i = 0; i < arr.Length-j; i++)//是为了排除已经排列的元素{//找出这一轮的极值if (arr[index] < arr[i])//>升序,<降序index = i;}if (index != arr.Length-1-j)//arr.Length-1-j是选择交换的初始位置{int temp = arr[index];arr[index] = arr[arr.Length-1-j];arr[arr.Length-1-j] = temp;}for (int i = 0; i < arr.Length; i++){Console.Write(" " + arr[i]);}Console.WriteLine();}}
}

总结

到此我们的选择排序就到此结束,C#基础部分的内容也即将告一段落,博主会在后续带着大家做一个简单的成绩录入系统,然后结束C#基础的学习。

学到目前,你已经快要拜托初学者,成为一名略懂语言的程序猿了。

不过,道阻且长,学习路上,戒骄戒躁,脚踏实地。

请期待我的下一篇博客!

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

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

相关文章

单链表(c语言简单实现)

单链表是一种常见的数据结构 一、结构特点 1. 由一系列节点组成&#xff0c;每个节点包含数据域和指向下一个节点的指针域。 2. 最后一个节点的指针域为 null&#xff0c;表示链表的结尾。 二、主要操作 1. 插入节点&#xff1a;可以在链表的头部、尾部或特定位置插入新节点。…

Docker安装rabbitmq并配置延迟队列

下载rabbitmq镜像 docker pull rabbitmq:management 运行rabbitmq镜像 docker run -id --namerabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 -e RABBITMQ_DEFAULT_USERtom -e RABBITMQ_DEFAULT_PASStom rabbitmq:management …

windows环境下MySQL启动失败 查看data文件夹中.err发现报错unknown variable ‘log‐bin=mysql‐bin‘

文章目录 问题解决方法 问题 今天在windows环境下配置MySQL主从同步&#xff0c;在修改my.ini文件后发现MySQL启动失败了 打开my.ini检查参数发现没有问题 [mysqld] #开启二进制日志&#xff0c;记录了所有更改数据库数据的SQL语句 log‐bin mysql‐bin #设置服务id&#x…

电子束光刻过程中的场拼接精度

以下内容如有错误&#xff0c;请不吝指教&#xff0c;感谢&#xff01; 1、EBL为什么会出现场拼接误差&#xff0c;如何解决&#xff1f; ChatGPT 说&#xff1a; 在电子束光刻&#xff08;EBL&#xff09;过程中&#xff0c;SOI&#xff08;硅绝缘体&#xff09;芯片上出现*…

操作系统 | 学习笔记 | | 王道 | 5.2 设备独立软件

5.2 设备独立性软件 IO核心子系统 磁盘IO也属于IO调度问题 5.2.1 与设备无关的软件 与设备无关的软件是I/O系统的最高层软件&#xff0c;它的下层是设备驱动程序。 设备保护&#xff1a; 操作系统需要实现文件保护功能&#xff0c;不同的用户对各个文件有不同的访问权限&am…

2024.9.20 作业

写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; a.在家目录下创建目录文件&#xff0c;dir b.dir下创建dir1和dir2 c.把当前目录下的所有文件拷贝到dir1中&#xff0c; d.把当前目录下的所有脚本文件拷贝到dir2中 e.把dir2打包并压缩为dir2.tar.xz f.再把…

VSCode开发ros程序无法智能提示的解决方法(一)

VSCode开发ros程序无法智能提示的解决方法&#xff08;一&#xff09; 问题解决 问题 在Ubuntu下使用vscode开发ros程序&#xff0c;无法进行智能提示。 解决 将 intelli Sense Engine 设置为 Tag Parser 即可。

SpringBoot实现OAuth客户端

背景 5 月份的时候&#xff0c;我实践并整理了一篇博客&#xff1a;SpringBoot搭建OAuth2&#xff0c;该博客完成之后&#xff0c;本以为能对OAuth2的认证机制更加清晰&#xff0c;但我却觉得自己更“迷惘”了。 抛开我在项目中积累的浅薄经验不谈&#xff0c;单从在网…

智慧园区的发展趋势

在数字经济高速发展、前瞻技术加速创新和社会需求革命的驱动下&#xff0c;江园科技智慧园区的未来发展将呈现数智化、融合化、人本化、韧性化和绿色化五大趋势。 趋势一&#xff1a;数智化 以万兆联接、数字平台为特征的基础设施将成为园区的核心底座。以 5.5G/NET5.5G/F5.5G…

深度图可视化显示(kitti)

文章目录 前言一、读取深度值与图像1、深度值读取2、图像读取 二、深度图可视化1、深度图可视化代码2、深度图可视化结果展示 三、深度图在图像上可视化1、可视化代码2、可视化坐标显示 四、完整代码 前言 kitti数据是一个通用数据&#xff0c;有关kitti的深度图像内容我已有博…

常见中间件漏洞靶场(tomcat)

1.CVE-2017-12615 开启环境 查看端口 查看IP 在哥斯拉里生成一个木马 访问页面修改文件后缀和文件内容 放包拿去连接 2.后台弱⼝令部署war包 打开环境 将前边的1.jsp压缩成1.zip然后改名为1.war 访问页面进行上传 在拿去连接 3.CVE-2020-1938 打开环境 访问一下 来到kali …

FRIDA-JSAPI:Java使用

Frida Frida.version 包含当前Frida版本信息的属性&#xff0c;以字符串形式表示。setImmediate(function (){console.log(Frida.version) })Java Java.perform(fn) 确保当前线程已附加到虚拟机&#xff0c;并调用 fn。 setImmediate(function (){Java.perform(function (){c…

时代变了,MySQL 早已不是最流行的数据库了

以下文章来源于古时的风筝 &#xff0c;作者风筝 在StackOverflow 上看到2024年技术趋势&#xff0c;关于数据库的部分&#xff0c;PostgreSQL 是开发人员使用最多的数据库&#xff0c;超过 MySQL 了。虽然在国内好像不是这样。 PostgreSQL 在 2018 年的开发者调查中首次亮相…

云韧性,现代云服务不可或缺的组成部分

韧性&#xff0c;一个物理学概念&#xff0c;表示材料在变形或者破裂过程中吸收能量的能力。韧性越好&#xff0c;则发生脆性断裂的可能性越小。 如今&#xff0c;韧性也延伸到企业特质、产品特征等之中&#xff0c;用于形容企业、产品乃至服务的优劣。同样&#xff0c;随着云…

电脑视频编辑常用软件:12个在线视频剪辑方法,这份免费攻略真实在!

您是否曾为视频剪辑而感到困惑&#xff0c;不知从何入手&#xff1f;面对众多的视频编辑软件和复杂的操作流程&#xff0c;怎样才能快速上手&#xff0c;制作出高质量的视频呢&#xff1f;许多内容创作者在编辑或上传较长视频时&#xff0c;常常遭遇到时间和质量的困扰。为了解…

私域直播平台带源码

源码地址:https://gitee.com/godsdodo/tencent-live.git 简介: #腾讯云直播 #腾讯云im #腾讯云白板 # 私域直播 #高并发直播分发; 基于腾讯云K8S搭建的私域直播培训平台,直播功能: 主播推流,智能直播,OBS推流 ## 助理平台: 场控控制,直播间管理,直播间数据统计 ## 用户端: 观看…

Double-Fetch漏洞检测工具的部署、使用与原理分析

文章目录 前言1、概述1.1、简介1.2、工作原理1.2.1、内核空间与用户空间的信息传递1.2.2、Double-Fetch漏洞产生的原因1.2.3、产生Double-Fetch漏洞的情况1.2.4、一个Double-Fetch漏洞示例1.2.5、Double-Fetch漏洞检测工具原理 1.3、模式匹配原理分析1.3.1、Coccinelle介绍1.3.…

使用 Bedrock 模型进行 SQL 查询生成:高效自动化的全新体验!

引言 在当今高度重视可持续发展的时代&#xff0c;亚马逊通过其 Bedrock 模型&#xff0c;展示了公司在运营和增长方面的战略愿景。同时&#xff0c;Amazon SageMaker 为机器学习领域的专业人士提供了强大的工具&#xff0c;加速了模型的开发和部署。 探索亚马逊的 Bedrock 模…

动态SQL中的foreach标签【后端 21】

动态SQL中的foreach标签 在Java开发中&#xff0c;特别是在使用MyBatis进行数据库操作时&#xff0c;动态SQL是一项非常强大的功能。MyBatis的<foreach>标签就是动态SQL中最为常用的一个&#xff0c;主要用于处理包含IN子句的查询或者批量插入等操作。本文将详细介绍<…

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

文章目录 前言准备工作获取第三方授权权限与授权配置信息集成金蝶云SDK调用实现备注前言 对于有自己商品信息管理后台并且使用金蝶ERP系统管理物料的商家来说,将金蝶上物料的库存信息同步到管理后台就可以不用去金蝶上确认库存了,可以大大简化管理后台的库存变更工作,这篇文…