C#基础(15)选择排序

news2024/9/22 0:30:05

前言 

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

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

时间复杂度

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

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

常见的时间复杂度有:

  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.coloradmin.cn/o/2153722.html

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

相关文章

借10万块,年化利息明明是3.8%,为啥就变成了2.07%?

今天咱们来聊一聊贷款的奥秘&#xff0c;特别是那个令人爱恨交织的年利率。听起来直观得很&#xff0c;3.8%就像是每年给银行支付贷款总额的3.8%作为利息&#xff0c;但实际上&#xff0c;这里面的学问挺深的。有时候&#xff0c;名义上的3.8%年化&#xff0c;最终一算&#xf…

MATLAB智能优化算法-学习笔记(3)——大规模邻域搜索算法求解旅行商问题【过程+代码】

一、问题描述 旅行商问题(TSP, Traveling Salesman Problem)是组合优化中的经典问题之一。给定一组城市和每对城市之间的距离,要求找到一条最短的路径,使旅行商从某个城市出发,访问每个城市一次并最终回到出发点。TSP问题广泛应用于物流配送、工厂调度、芯片制造等领域。…

RK3588/RK3588s运行yolov8达到27ms

前言 Hello&#xff0c;小伙伴们~~我最近做了一个比较有意思的东西&#xff0c;想起来也好久没有写博客了&#xff0c;就记录一下吧。希望和大家一起学习&#xff0c;一起进步&#xff01; 我简单介绍一下我最近做的这个东西的经过哈~上个月在B站上看到了一个博主发了一条视频关…

DataGrip远程连接Hive

学会用datagrip远程操作hive 连接前提条件&#xff1a; 注意&#xff1a;mysql是否是开启状态 启动hadoop集群 start-all.sh 1、启动hiveserver2服务 nohup hiveserver2 >> /usr/local/soft/hive-3.1.3/hiveserver2.log 2>&1 & 2、beeline连接 beelin…

上海市高等学校信息技术水平考试 C程序设计(2021A场)全解

2e-1 为 1.0^(-1)*2 在顺序查找法中&#xff0c;如果要从n个学生中找到某个特定的学生信息&#xff0c;最坏的情况是这个学生是最后一个被比较的&#xff0c;这时需要比较n次。但是&#xff0c;如果学生是均匀分布的&#xff0c;那么平均来说&#xff0c;你会在列表的中间找到这…

stm32单片机个人学习笔记5(OLED调试工具)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

校园场景物体检测系统源码分享

校园场景物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

【RabbitMQ】⾼级特性

RabbitMQ ⾼级特性 1. 消息确认1.1 消息确认机制1.2 代码示例 2. 持久化2.1 交换机持久化2.2 队列持久化2.3 消息持久化 3. 发送⽅确认3.1 confirm确认模式3.2 return退回模式3.3 问题: 如何保证RabbitMQ消息的可靠传输? 4. 重试机制5. TTL5.1 设置消息的TTL5.2 设置队列的TTL…

华为HarmonyOS地图服务 10 - 如何在地图上绘制圆?

场景介绍 本章节将向您介绍如何在地图上绘制圆形。 接口说明 添加圆形功能主要由MapCircleOptions、addCircle和MapCircle提供,更多接口及使用方法请参见

gbase8s数据库常见的索引扫描方式

1 顺序扫描&#xff08;Sequential scan&#xff09;&#xff1a;数据库服务器按照物理顺序读取表中的所有记录。 常发生在表上无索引或者数据量很少或者一些无法使用索引的sql语句中 2 索引扫描&#xff08;Index scan&#xff09;&#xff1a;数据库服务器读取索引页&#…

Leetcode—1184. 公交站间的距离【简单】

2024每日刷题&#xff08;161&#xff09; Leetcode—1184. 公交站间的距离 实现代码 class Solution { public:int distanceBetweenBusStops(vector<int>& distance, int start, int destination) {int clockwise 0;int counterclockwise 0;if(start > desti…

CompletableFuture的allOf一定不要乱用!血泪史复盘

文章目录 1. 到底遇到了什么问题&#xff1f;2. CountDownLatch搞起&#xff1f;3. allOf里面的坑4. 优化建议&#xff1a; 1. 到底遇到了什么问题&#xff1f; 最近看到组里面的同学遇到了这样的业务场景&#xff1a; 主线程需要异步并发调用多个接口&#xff0c;并且主线程…

大模型终极指南:零基础到精通,一文搞定!

随着 ChatGPT 的到来&#xff0c;大模型[1]&#xff08;Large Language Model&#xff0c;简称 LLM&#xff09;成了新时代的 buzzword&#xff0c;各种 GPT 产品百花齐放。 大多数人直接用现有产品就可以了&#xff0c;但对于喜欢刨根问底的程序员来说&#xff0c;能够在本地…

python-SZ斐波那契数列/更相减损数

一&#xff1a;SZ斐波那契数列题目描述 你应该很熟悉斐波那契数列&#xff0c;不是吗&#xff1f;现在小理不知在哪里搞了个山寨版斐波拉契数列&#xff0c;如下公式&#xff1a; F(n) { $\ \ \ \ \ \ \ \ \ \ \ \ $ a,( n1) $\ \ \ \ \ \ \ \ \ \ \ \ $ b,( n2) $\ \ \ \ \ \ …

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测 目录 回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.ReliefF-xgboost回归预测代码&#xff0c;对序列数据预测性能相对较高。首先通过ReleifF对输入特征计算权…

Spring中的Web Service消费者集成(应该被淘汰的技术)

问题 最近需要对接一个老系统的web service接口&#xff0c;我已经有7&#xff0c;8年没有遇到过这种接口了。 思路 先用Spring空项目中的jaxws-maven-plugin插件生成一波web service客户端&#xff0c;然后&#xff0c;集成到现有的SpringBoot3项目中使用就可以了。 生成w…

人才有约,职为你:颐年集团携手粤荣学校共绘养老行业的美好未来

摘要&#xff1a;广州市白云区粤荣职业培训学校成功举办“人才有约&#xff0c;职为你”颐年集团养老机构线下招聘会 2024年9月19日下午2点30分&#xff0c;广州市白云区金骊城二楼热闹非凡。粤荣职业培训学校携手颐年集团&#xff0c;共同举办了主题为“人才有约&#xff0c;…

做短剧申请微信小程序备案整体的操作流程!

做国内短剧对接微信小程序&#xff0c;小程序备案是必不可少的&#xff0c;需要准备哪些资料&#xff0c;以及需要注意的事项&#xff0c;所需材料全部整理出来了&#xff0c;小程序从注册到类目和备案分为五个步骤来讲解&#xff0c;下面就由我来向大家介绍所有的操作流程。 …

【RabbitMQ】消息分发、事务

消息分发 概念 RabbitMQ队列拥有多个消费者时&#xff0c;队列会把收到的消息分派给不同的消费者。每条消息只会发送给订阅该队列订阅列表里的一个消费者。这种方式非常适合扩展&#xff0c;如果现在负载加重&#xff0c;那么只需要创建更多的消费者来消费处理消息即可。 默…

docker desktop windows stop

服务docker改为启动 cmd下查看docker版本 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://hub.atomgit.com/"]…