C#基础(14)冒泡排序

前言

其实到上一节结构体我们就已经将c#的基础知识点大概讲完,接下来我们会讲解一些关于算法相关的东西。

我们一样来问一下gpt吧:

Q:解释算法

A:

算法是一组有序的逻辑步骤,用于解决特定问题或执行特定任务。它可以是一个计算过程、一个计算机程序或一套规则。

算法具有以下特征:

  1. 输入:算法具有零个或多个输入变量,这些变量是算法运行时需要提供的数据。
  2. 输出:算法产生一个或多个输出结果,这些结果是通过对输入数据进行计算和处理得到的。
  3. 有穷性:算法必须在有限的步骤内停止,不会无限循环或进入死循环。
  4. 确定性:算法中的每个步骤必须明确定义,不会产生二义性或歧义。
  5. 可行性:算法必须可以实际执行,能够在有限的时间内得到结果。
  6. 通用性:算法可以用来解决一类问题,而不仅仅是特定的实例。

在计算机科学中,算法通常描述为一系列的操作、条件语句、循环结构和函数调用,用来指示计算机在进行数据处理时应遵循的步骤和规则。算法可以用伪代码、流程图、程序代码或其他可读性强的形式来描述。

算法的设计和分析是计算机科学中的重要研究领域。一个好的算法可以显著提高计算效率和资源利用率,而糟糕的算法则可能导致低效或不可接受的性能。因此,研究者和开发者在编写程序时应该选择和优化适当的算法来解决问题。

这样看上去难免还是觉得很复杂,那我们再百度一下:

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。 也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

还是麻烦了,那博主再给你精简一点:

算法就是解决一些问题的计算方法。

这个想毕你就很快就能理解了,哦,其实就是一个方程式嘛,我带入一个值它给我一个值。

对的,算法也是这样,当然他可能输入很多个值,出来很多个值,但这些都不重要,你只要知道它是用来解决实际问题的方法,算法高不高级,就看你解决问题所需要的时间少不少。

那其实算法也并不难嘛。

当然,入门肯定不难。

而今天,我们就来讲解第一个入门的算法,冒泡排序。

排序

排序:是计算机内经常进行的一种操作,,其目的是讲一组没有顺序的记录按一定顺序排好。

程序中,经常对数组排序

冒泡排序的基本原理

看到这个图,不知道你是否有一些想法:

通过重复比较相邻两个元素的大小,并根据比较结果交换位置,将最大(或最小)的元素逐步“冒泡”到数列的末尾(或开头)。

对,就像鱼儿吐泡泡一样,这样我们就只需要反复比较n-1次(这样才能保证完全排完),就能得到最终的排列结果。

代码实现

我们先来实现从头开始,第一个数的比较。

首先我们来分析一下思路,我们先声明一个数组过后,我们就要开始遍历了,既然我们是和数组下一个元素比较,那么我们就要考虑到什么时候停止。

当然是元素如果排到最后一个就可以停止了。

那假设我们的元素会排到数组的的末尾,那他还会比较吗?显然是不用的,所以我们遍历的时候,也只用遍历到倒数第二个元素就可以了,因为在倒数第二个元素的比较就是我们最后的比较。

以下是我们实现一个数的比较的代码。

using System;
using System.Runtime.Serialization.Formatters;class Program
{static void Main(string[] args){int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };for (int i = 0; i < arr.Length-1; i++){if (arr[i] > arr[i+1]) //大于升序,小于降序{int temp = arr[i];//声明一个临时变量存储值,避免值消失arr[i] = arr[i+1];arr[i+1] = temp;}}for (int i = 0;i < arr.Length;i++){Console.WriteLine(arr[i]);}}
}

然后我们就要进行多轮比较吧,那我们假设不知道里面有个数,那我们又假设最坏的情况,就是我们必须遍历到最后一个数才能将数组完全排序完毕,那简单了:

我们有多少个数就排多少次,这样一定能排完,所以我们在外层加一个for循环。

using System;
using System.Runtime.Serialization.Formatters;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++){for (int i = 0; i < arr.Length - 1; i++){if (arr[i] > arr[i + 1]) //大于升序,小于降序{int temp = arr[i];//声明一个临时变量存储值,避免值消失arr[i] = arr[i + 1];arr[i + 1] = temp;}}}for (int i = 0;i < arr.Length;i++){Console.WriteLine(arr[i]);}}
}

以上就是最基本的冒泡排序的c#实现,我们运行程序,就能看到他能将我们想要的数组给排列好。

优化

我想你已经掌握了冒泡排序的基本思路,但我还想提出几点可以优化的地方,但这个相对来说比较难理解。为了方便你观察流程,博主接下来的代码将每一次遍历的结果都打印了出来。

  1. 首先,我们在一次比较中并不是一定要遍历完所有数的,在前面比较中就确定了位置的数,其实就没必要继续比较了
  2. 特殊情况的优化:排序在前面几个数的时候就完成了排序,就不用继续排序了。

废话少说,上代码,详情请看注释,不懂可以私信博主。

你可以尝试把优化点去掉,然后去感受一下原本的比较和现在的比较的差别。

当然你可能会从时间复杂度O(n2)上挑刺上说这种优化没有必要(因为时间复杂度没有变),但你要明白,性能优化,永远是程序员最大的敌人。你学习的更多是这种思路:

有没有多余的计算进行?能否简洁运算?能否更快地得出答案?

而不是死啃书本,你书本上的东西都要落实到实际。

using System;
using System.Runtime.Serialization.Formatters;class Program
{static void Main(string[] args){int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };bool isMPSort=false;for (int j = 0; j < arr.Length; j++){isMPSort = false;for (int i = 0; i < arr.Length - 1-j; i++)//第一个优化点{if (arr[i] > arr[i + 1]) //大于升序,小于降序{isMPSort = true;//第二个优化点int temp = arr[i];//声明一个临时变量存储值,避免值消失arr[i] = arr[i + 1];arr[i + 1] = temp;}}if (!isMPSort)//如果没有进行排序,其实是数组排序已经完成{break;}for (int i = 0; i < arr.Length; i++){Console.Write(" " + arr[i]);}Console.WriteLine();}for (int i = 0;i < arr.Length;i++){Console.Write(" "+arr[i]);}}
}

 总结

我们今天对第一个算法冒泡排序进行了学习,如果你是初次接触编程的人,那可能是有一定的难度,但我希望你切切实实去敲敲代码,去一步一步调试,然后去感受这种算法背后的思想。

冒泡排序是你学习的第一个算法,但绝对不是最后一个。

想要成为一个强大的程序猿,还任重道远呢。

还是那句话,戒骄戒躁,脚踏实地!

请期待我的下一篇博客。

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

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

相关文章

Python全网最全基础课程笔记(十一)——字符串所有操作,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

本专栏系列为Pythong基础系列&#xff0c;每篇内容非常全面&#xff0c;包含全网各个知识点&#xff0c;非常长&#xff0c;请耐心看完。 每天都会更新新的内容&#xff0c;搜罗全网资源以及自己在学习和工作过程中的一些总结&#xff0c;可以说是非常详细和全面。 以至于为什么…

麦克风是不是越贵越好?选购无线麦克风需注意的五个关键点

相信接触过短视频或者直播行业的朋友们都知道麦克风的重要性&#xff0c;这是拍摄中很常用的设备&#xff0c;而麦克风的好坏也决定了整体音质的效果如何。不过有些刚入门的朋友们对麦克风并不是很了解&#xff0c;认为麦克风是不是越贵就越好&#xff1f; 其实并不是&#xff…

电抗器可以减少发电机阻力吗

电抗器通常用于电力系统中主要为了限制短路电流、改善功率因数和抑制谐波等&#xff0c;而不是直接减少发电机的阻力。具体来说&#xff0c;电抗器在发电机系统中的作用主要包括以下几个方面&#xff1a; 1. 限制短路电流 电抗器&#xff08;特别是限流电抗器&#xff09;可以…

22:SPI一:简单的使用

SPI简单的使用 1、什么是SPI2、数据通信2.1&#xff1a;5个重要参数2.2&#xff1a;4种传输模式 3、程序模拟SPI通信时序3、片上外设SPI通信时序 1、什么是SPI SPI是一种同步的&#xff0c;全双工&#xff0c;支持总线挂载多设备的通信协议。它特别适用于高效&#xff0c;快速…

激光粉尘传感器:筑牢粮仓安全防线,有效应对粮食粉尘爆炸高危风险

随着我国农业的持续发展和粮食产量的稳步提升&#xff0c;2023年全国粮食总产量达到了13908.2亿斤&#xff0c;这一丰硕成果不仅保障了国家的粮食安全&#xff0c;也对粮食的储备、加工、运输等环节提出了更高的要求。然而&#xff0c;在粮食产业链的各个环节中&#xff0c;粮食…

11_Python函数基本概念和示例

函数 函数是组织代码、提高代码复用性的基本工具。一个函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。函数类型&#xff1a;内置函数、自定义函数 定义函数 在 Python 中&#xff0c;使用 def 关键字来定义一个函数。 函数可以有参数&#xff0c;也可以…

虚拟背景扣像SDK解决方案,电影级抠像技术

美摄科技&#xff0c;作为影像技术领域的领航者&#xff0c;凭借其革命性的虚拟背景抠像SDK解决方案&#xff0c;正以前所未有的方式&#xff0c;重新定义电影级背景抠像技术&#xff0c;让直播与视频制作迈入全新境界。 电影级抠像技术&#xff0c;重塑视觉盛宴 美摄科技的虚…

Appium环境搭建及元素定位

Appium是一个开源测试自动化框架&#xff0c;可用于原生&#xff0c;混合和移动Web应用程序测试。它使用WebDriver 协议驱动iOS&#xff0c;Android和Windows应用程序。 01 环境搭建步骤 Appium环境安装&#xff1a; 第一步安装 appium 桌面版客户端 Appium-1.12.1.dmg(MAC…

比亚迪高歌猛进背后,高端市场攻坚与出海风险并存

比亚迪高速扩张的繁荣表象之下&#xff0c;仍遭遇高端市场挑战&#xff0c;全球化征程面临可持续性考验。 转载&#xff1a;科技新知 原创 作者丨颜曌 编辑丨蕨影 比亚迪的发展史&#xff0c;堪称我国新能源汽车品牌的缩影。如今在全球新能源市场越来越有影响力的比亚迪&…

自动化测试需要学什么【附学习路线和学习教程】

随着自动化测试行业的薪酬越来越高&#xff0c;平均月薪早在很多年前就已破万&#xff0c;也有越来越多的人愿意投身测试行业&#xff0c;成为一名测试工程师&#xff0c;这些人当中也有相当多的一部分是测试行业的小白&#xff0c;并不知道自动化测试需要学习哪些内容 在放上…

第二届Apache Flink极客挑战赛冠军比赛攻略_SkyPeaceLL队

关联比赛: 第二届 Apache Flink极客挑战赛 赛题介绍 指定的数据集一、病例行动数据集 病例历史行动数据集&#xff08;训练集1&#xff09; 1M确诊病例数据 &#xff08;测试集1&#xff09; 500实时病例行动数据集&#xff08;测试集2&#xff09; 1000二、天猫精灵行为数据…

【服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)

文章目录 一、阿里云OSS对象存储服务介绍二、服务开通与使用准备1、准备工作2、开通OSS云服务&#xff08;新用户免费使用三个月&#xff09;3、创建存储空间bucket4、创建并保存Accesskey5、配置访问凭证AK & SK&#xff08;系统环境变量&#xff09; 三、阿里云OSS使用步…

codemirror 代码在线编辑器基本使用

CodeMirror 是一个强大的基于浏览器的文本编辑器组件&#xff0c;主要用于网页中创建可编辑的源代码区域&#xff0c;特别适用于编写和展示程序代码。它支持多种编程语言的语法高亮、代码折叠、自动补全、查找替换等多种高级编辑特性。 npm install vue-codemirror --save 或者…

张恒汝的个人简介:招生宣传用

张恒汝&#xff0c;男&#xff0c;九三学社社员&#xff0c;博士&#xff0c;教授&#xff0c;硕士生导师&#xff0c;机器学习研究中心副主任&#xff0c;四川省学术和技术带头人后备人选&#xff0c;中国科协科技人才奖项评审专家&#xff0c;四川省网络安全与信息化技术专家…

HarmonyOS开发实战( Beta5.0)使用GTest测试C++案例

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例主要介绍如何在HarmonyOS NEXT应用中使用GTest测试…

基于Java的学生档案管理系统的设计与实现

基于springbootvue实现的学生档案管理系统 &#xff08;源码L文ppt&#xff09;4-065 第4章 系统设计 4.1 总体功能设计 学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面&#xff0c;支…

Cpp类和对象(上)(3)

文章目录 前言一、面向过程与面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及类的封装类的访问限定符类的封装 五、类的作用域(类域)六、类的实例化七、类对象模型如何计算类对象的大小类对象的存储方式猜测 八、this指针this指针的引出this指针的特性 九、C语言…

天池Fashion AI 比赛失败经历分享

关联比赛: FashionAI全球挑战赛—服饰关键点定位 昨天是天池Fashion AI初赛Deadline&#xff0c; 成绩出来复赛都没能进&#xff0c;虽然结果很遗憾&#xff0c;但在比赛的过程中也接触到了不少的新东西&#xff0c;希望能在这里把我尝试过的方法都分享出来。作为对自己的总结…

EPLAN中如何切换编辑区的背景颜色为黑色?

EPLAN中如何切换编辑区的背景颜色为黑色&#xff1f; 如下图所示&#xff0c;打开EPLAN软件&#xff0c;打开或新建一个项目&#xff0c; 如下图所示&#xff0c;点击选项----设置&#xff0c; 在弹出的窗口中找到用户----图形的编辑------2D&#xff0c;在右侧找到颜色设置---…

便携式气象监测站的工作原理

型号&#xff1a;TH-BQX9】便携式气象环境监测站是一种集数据采集、处理、传输于一体的便携式设备&#xff0c;主要用于实时、准确地监测环境中的多种气象要素。便携式气象环境监测站通常能够监测多种气象参数&#xff0c;包括但不限于温度、湿度、风速、风向、气压、降雨量、太…