C#基础(14)冒泡排序

news/2024/9/19 12:03:30/ 标签: 算法, c#, 开发语言

前言

其实到上一节结构体我们就已经将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.ppmy.cn/news/1527631.html

相关文章

linux-Shell 编程-常用 Shell 脚本技巧

Linux Shell 编程&#xff1a;常用 Shell 脚本技巧 一、概述 Shell 脚本是 Linux 系统管理员和开发人员日常自动化任务的重要工具。通过编写 Shell 脚本&#xff0c;用户可以自动化重复性工作、简化系统维护、管理服务器资源等。Shell 脚本的强大之处在于其简洁和灵活性&…

手势识别-Yolov5模型-自制数据集训练

1、源码下载&#xff1a; 大家可以直接在浏览器搜索yolov5即可找到官方链接&#xff0c;跳转进github进行下载&#xff1a; 这里对yolov5模型补充说明一下&#xff0c;它是存在较多版本的&#xff0c;具体信息可在master->tags中查看&#xff0c;大家根据需要下载。这些不同…

Golang如何优雅的退出程序

Golang如何优雅的退出程序 在 Go 中优雅地退出程序&#xff0c;通常需要处理一些清理工作&#xff0c;如关闭文件、网络连接、释放资源等。以下是一些常见的方法&#xff1a; 一、使用 os.Signal 和 signal.Notify 捕获系统信号&#xff1a;可以使用 os/signal 包来捕获中断…

Android中如何处理运行时权限?

在Android中&#xff0c;处理运行时权限是开发过程中一个至关重要的环节&#xff0c;它自Android 6.0&#xff08;API级别23&#xff09;引入&#xff0c;旨在提高用户隐私保护和应用的透明度。以下将详细阐述Android中处理运行时权限的方法、步骤、注意事项以及相关的最佳实践…

最优化理论与自动驾驶(十一):基于iLQR的自动驾驶轨迹跟踪算法(c++和python版本)

最优化理论与自动驾驶&#xff08;四&#xff09;&#xff1a;iLQR原理、公式及代码演示 之前的章节我们介绍过&#xff0c;iLQR&#xff08;迭代线性二次调节器&#xff09;是一种用于求解非线性系统最优控制最优控制最优控制和规划问题的算法。本章节介绍采用iLQR算法对设定…

使用阿里OCR身份证识别

1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…

STM32快速复习(十二)FLASH闪存的读写

文章目录 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f;二、使用步骤1.标准库函数2.示例函数 总结 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f; 1、FLASH简介 &#xff08;1&#xff09;STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&…

AcWing算法基础课-789数的范围-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》789 题——数的范围。本文详细解析了一个基于二分查找的算法题&#xff0c;题目要求在有序数组中查找特定元素的首次和最后一次出现的位置。通过使用两个二分查找函数&#xff0c;程序能够高效…

随机规划及其MATLAB实现

目录 引言 随机规划的基本模型 随机动态规划 随机动态规划建模实例​(随机动态规划)&#xff1a; MATLAB中的随机规划实现 示例&#xff1a;两阶段随机规划 表格总结&#xff1a;随机规划求解方法与适用场景 结论 引言 随机规划&#xff08;Stochastic Programming&…

VulhubDC-4靶机详解

项目地址 https://download.vulnhub.com/dc/DC-4.zip实验过程 将下载好的靶机导入到VMware中&#xff0c;设置网络模式为NAT模式&#xff0c;然后开启靶机虚拟机 使用nmap进行主机发现&#xff0c;获取靶机IP地址 nmap 192.168.47.1-254根据对比可知DC-4的一个ip地址为192.1…

C++——多态的原理

多态的原理 多态的原理引入虚函数表 多态的原理 引入 如下代码的输出结果为&#xff08;&#xff09; A.编译报错 B.运行报错 C.8 D.12 上⾯题⽬运⾏结果12bytes&#xff0c;除了_b和_ch成员&#xff0c;还多⼀个__vfptr放对象的前⾯(注意有些平台可能会放到对象的最后⾯&am…

web基础—dvwa靶场(七)SQL Injection

SQL Injection&#xff08;SQL注入&#xff09; SQL Injection&#xff08;SQL注入&#xff09;&#xff0c;是指攻击者通过注入恶意的SQL命令&#xff0c;破坏SQL查询语句的结构&#xff0c;从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的&#xff0c;常常会导致…

AI绘画:科技赋能艺术的崭新时代

&#x1f4af;AI绘画&#xff1a;走进艺术创新的新时代 人工智能在改变世界的过程中&#xff0c;AI绘画工具逐渐成为创新的典范。 本文将为您揭示AI绘画背后的技术秘密、潜在的应用场景&#xff0c;并为您推荐几款出色的AI绘画工具&#xff0c;助您领略这一技术带来的艺术新体…

git bash中执行java命令乱码问题处理

Git Bash中执行java命令显示乱码 购机自带windows字符集为gbk&#xff0c;git bash默认为utf8&#xff0c;导致中文字符显示乱码 处理方案如下 顶部右键点击Options 选择Text&#xff0c;更换字符集即可

彩蛋岛 销冠大模型案例

彩蛋岛 销冠大模型案例 任务&#xff1a; https://kkgithub.com/InternLM/Tutorial/tree/camp3/docs/EasterEgg/StreamerSales 视频 https://www.bilibili.com/video/BV1f1421b7Du/?vd_source4ffecd6d839338c9390829e56a43ca8d 项目git地址&#xff1a; https://kkgithu…

VideoPlayer插件的用法

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容&#xff0c;本章回中将介绍如何播放视频.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…

[深度学习]Pytorch框架

1 深度学习简介 应用领域&#xff1a;语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解 2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年&#xff0c;chatGPT出现&#xff0…

C++11新特性学习

C11 1. C11新特性 自动类型推导&#xff08;auto&#xff09;智能指针&#xff08;提供更安全和更高效的内存管理&#xff09;移动语义和右值引用 (move语义 &&&#xff0c;使得对象移动而非拷贝&#xff0c;在处理大量数据时提高程序性能)Lambda 表达式&#xff08;…

idea连接docker 自动化部署

进入Linux服务器 vim /lib/systemd/system/docker.service将 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 替换为 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock新建文件 Dockerfile配置Dockerfile文…

CTF比赛中的Git相关题目解题思路

在CTF比赛中&#xff0c;涉及Git相关的题目通常会考察参赛者对Git仓库的了解&#xff0c;尤其是如何利用公开或不完整的Git仓库来恢复源代码或获取敏感信息。本文将结合一些常见的工具和步骤&#xff0c;详细介绍如何解决这类题目。 背景 Git是一种分布式版本控制系统&#…