C#基础(15)选择排序

devtools/2024/9/24 12:31:45/

前言 

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

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

时间复杂度

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

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

常见的时间复杂度有:

  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.ppmy.cn/devtools/116490.html

相关文章

vue + leaflet + 天地图实现搜索省份后高亮

实现省份高亮方法最重要的代码在于 L.geoJSON(district).addTo(map)这个方法&#xff0c;district为参数&#xff0c;可以在页面中引入当前省份的坐标json。 获取省份json文件的地址&#xff1a;https://datav.aliyun.com/portal/school/atlas/area_selector import beijing …

Android下MVP和MVVM模式的实践

转载注明出处&#xff1a;https://blog.csdn.net/skysukai 1、前言 MVP和MVVM诞生已经好些年头了&#xff0c;记得刚毕业才参加工作的时候&#xff0c;第一次见到了有上万行的Activity&#xff0c;这种巨无霸的Activity维护起来简直就是噩梦。这时候&#xff0c;就需要进行代…

中电金信多模态鉴伪技术抵御AI造假威胁

AI换脸技术&#xff0c;属于深度伪造最常见方式之一&#xff0c;是一种利用人工智能生成逼真的虚假人脸图片或视频的技术。基于深度学习算法&#xff0c;可以将一个人的面部特征映射到另一个人的面部&#xff0c;创造出看似真实的伪造内容。近年来&#xff0c;以AI换脸为代表的…

dbt snapshot命令及应用示例

DBT是一种功能强大的数据转换工具&#xff0c;它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够创建快照&#xff0c;这是跟踪数据随时间变化的一种方法。本文带你一起完成创建和使用dbt快照的过程。 理解缓慢变化维度 缓慢变化维度(scd)是数据仓…

什么是孤儿进程和僵死进程?

一、前言 本文先介绍unix系统中进程的退出以及终止过程&#xff0c;然后介绍什么是孤儿进程以及僵死进程。包含如下内容&#xff1a; 1.进程终止过程 2.孤儿进程 3.僵死进程 二、进程终止的过程 2.1 进程的终止状态 进程终止分为正常终止和异常终止。 正常终止包括如下5种情…

使用【Sa-Token】实现Http Basic 认证

使用Sa-Token开源架构快速实现Http Basic 认证&#xff0c;如上图 1、springboot环境下直接添加starter即可 <!-- Sa-Token 权限认证&#xff0c;在线文档&#xff1a;https://sa-token.cc --> <dependency><groupId>cn.dev33</groupId><artifactI…

axios封装RESTful API 接口

RESTful API 概念 RESTful API &#xff08;Representational State Transfer&#xff09;是一种设计风格和架构原则&#xff0c;用于构建网络应用程序的接口。它基于 HTTP 协议&#xff0c;并使用一组规范来定义和处理资源。 RESTful API 的核心概念是资源&#xff08;Resou…

性能监控之Python实战SkyWalking链路追踪

文章目录 一、介绍二、SkyWalking支持的语言三、SkyWalking安装3.1 前提准备3.2 先安装ElasticSearch7.X3.3 Skywalking-OAP 安装3.4 Skywalking-UI 界面安装3.5 访问页面检查SkyWalking是否可以访问 四、Python 项目接入SkyWalking4.1 演示项目代码4.2 验证 sw-python4.3 配置…