C#基础(14)冒泡排序

news2024/9/24 18:32:53

前言

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

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

相关文章

FileLink跨网文件传输 | 跨越网络边界的利器,文件传输不再受限

在当今数字化时代&#xff0c;企业与个人对文件传输的需求不断增长&#xff0c;尤其是在跨网环境中。传统的文件传输方式常常受到网络带宽、传输速度和安全性的限制&#xff0c;给用户带来了诸多不便。FileLink 的出现&#xff0c;为这一难题提供了完美解决方案&#xff0c;让文…

理解Web3:去中心化互联网的基础概念

随着科技的不断进步&#xff0c;互联网的形态也在不断演变。从最初的静态网页&#xff08;Web1&#xff09;到动态的社交网络&#xff08;Web2&#xff09;&#xff0c;如今我们正步入一个新的阶段——Web3。这一新兴概念不仅代表了一种技术革新&#xff0c;更是一种互联网使用…

RocketMQ简介与应用场景

简介 RocketMQ是一个由阿里巴巴开源并捐献给Apache的分布式消息中间件&#xff0c;具有高吞吐、低延迟、海量消息堆积等特点&#xff0c;广泛应用于各种分布式系统和大规模数据处理场景。 核心特征 1、高吞吐与低延迟&#xff1a;RocketMQ支持极高的消息吞吐量和极低的消息延…

优思学院|ABC成本方法与精益管理

传统企业计算成本主要基于直接费用。其次的间接费用只需根据某项标准&#xff08;作业时间等&#xff09;&#xff0c;粗略地将费用分配给各种产品即可。 近来&#xff0c;生产线自动化与间接业务高度复杂化&#xff0c;间接费用在制造成本中的比重越来越高&#xff0c;传统的…

netty编程之那么多的网络框架为啥非选你?

写在前面 java nio框架不止一种&#xff0c;为啥非选netty&#xff1f;本文来看下。 1&#xff1a;正文 网络io框架&#xff0c;除了netty外&#xff0c;还有mina&#xff0c;sun grizzly&#xff0c;cindy等&#xff0c;为啥独选netty。 mina netty和mina作者同属一人&…

【计算机视觉】YoloV8-训练与测试教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 制作数据集 Labelme 数据集 数据集选用自己标注的&#xff0c;可参考以下&#xff1a…

用ArcMap实现可视域分析

在 ArcToolbox>>3D Analyst>>可见性>>视域&#xff0c;输入值如图所示&#xff1a; 设置完成后点击确认&#xff0c;生成可视域分析图层 Viewshe1&#xff0c;由内容列表 可见&#xff0c;红色为不可见&#xff0c;绿色为可见。 改变观察点的高度&#xff1a…

pycharm下载selenium等软件包时提示下载超时

1.问题描述 我今天在pycharm运行刚写的自动化脚本时&#xff0c;提示selenium模块未导入&#xff08;自动到导入&#xff09;&#xff0c;鼠标移动到【from selenium import webdriver]的selenium时&#xff0c;显示【未存在文档】 2 解决办法 文件--设置--项目&#xff1a;当前…

企业智能培训新方案,高效打造金牌员工

标品市场竞争激烈&#xff0c;小微企业因长期专注于非标业务或者偏定制化路线&#xff0c;在团队专业能力与大型企业间存在显著差距。专业人才短缺、培养成本高企、培训滞后、效果难测、资源不均、考核标准不一及知识转化率低等问题&#xff0c;成为其业务转型的绊脚石。 如何高…

红外热成像应用场景!

1. 电力行业 设备故障检测&#xff1a;红外热成像仪能够检测电气设备&#xff08;如变压器、电线接头&#xff09;的过热现象&#xff0c;及时发现并定位故障点&#xff0c;预防火灾等安全事故的发生。 水电站查漏&#xff1a;在水电站中&#xff0c;红外热成像仪可用于快速查…

windows自带的录屏功能好用吗?这4款录屏工具也是不错的选择。

因为现在很多人都会有录屏需求&#xff0c;所以平常使用的一些设备当中会有自带的录屏功能。比如windows10系统下只要按下键盘上的 “WinG” 键&#xff0c;就可打开录屏功能。但是录制的时长会有限制&#xff0c;并且录屏功能会有些限制。如果对录屏有更多的需求&#xff0c;可…

网络设备驱动中的调试级别msglevel

网络设备驱动调试级别可以在驱动初始化过程中赋初值&#xff0c;并通过ethtool_ops中.get_msglevel获取&#xff0c;通过.set_msglevel进行设置或修改&#xff0c;并通过如netif_msg_drv这样的宏函数来在需要打印调试信息时进行判断&#xff0c;为真时输出对应级别的调试信息&a…

QT----基于QML的计时器

赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel class TimeListModel : public QAbstrac…

AIGC基础工具-科学计算和数据处理的重要库NumPy(Numerical Python)简介

文章目录 1. NumPy 的核心概念1.1 ndarray&#xff1a;多维数组对象示例代码 2. NumPy 的数据类型 (dtype)示例代码 3. NumPy 的数组创建方法3.1 使用 array() 创建数组3.2 使用 zeros() 和 ones()3.3 使用 arange() 和 linspace()3.4 使用 random 模块生成随机数组 4. NumPy 数…

AOT源码解析4.3-model主体解析

1.添加参考图像&#xff08;add_reference_frame&#xff09; 1.1 生成位置编码和ID编码 具体操作见详情。 图1&#xff1a;如图所示&#xff0c;显示的是参考图像的位置编码和id编码的生成过程。对于id编码&#xff0c;将mask图像输入进conv2d卷积网络后&#xff0c;进行结…

容器化安装Jenkins部署devops

基础环境介绍 系统使用的是centos7.9 内核使用的是5.16.13-1.el7.elrepo.x86_64 容器使用的是26.1.4 docker-compose使用的是 v2.29.0 链路图 devops 配置git环境插件 部署好jenkins后开始配置 jenkins连接git&#xff0c;这里需要jenkins有连接git的插件。在已安装的插件…

【SD教程】图片也能开口说话?别惊讶!用SadTalker插件,一键生成自己的数字人,本地部署,免费使用!(附资料)

最近数字人越来越火&#xff0c;连互联网大佬都纷纷下场&#xff0c;比如360的周鸿祎&#xff0c;京东的刘强东等等。小伙伴可能也想拥有自己的数字人如果想用最简单的方式&#xff0c;那么可以用第三方的网站&#xff0c;例如 HeyGen平台、腾讯的智影等等。可这些网站都是收费…

HFSS中看TDR波形详细设置以及相关的解释

时域反射测量&#xff08;TDR&#xff09;中心思想就是用阶跃函数作为激励&#xff0c;应用在模型上&#xff0c;并检查反射随时间的变化。在检查时域之前&#xff0c;必须对driven solution&#xff08;Modal、Terminal或Transient&#xff09;执行插值扫描。然后&#xff0c;…

vite分目录打包以及去掉默认的.gz 文件

1.vite打包情况介绍&#xff1a; 1.1vite在不进行任何配置的情况下&#xff0c;会将除开public的所有引用到资源打包编译添加哈希值至assets文件夹中&#xff08;非引用文件以及行内样式图片未被打包编译资源会被treeSharp直接忽略不打包&#xff09;&#xff0c;     1.2w…

阿里云函数计算 x NVIDIA 加速企业 AI 应用落地

作者&#xff1a;付宇轩 前言 阿里云函数计算&#xff08;Function Compute, FC&#xff09;是一种无服务器&#xff08;Serverless&#xff09;计算服务&#xff0c;允许用户在无需管理底层基础设施的情况下&#xff0c;直接运行代码。与传统的计算架构相比&#xff0c;函数…