【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)

简介: 【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)

一、冒泡排序算法

冒泡排序算法是程序设计中一种较简单的排序算法,其原理是重复的对要排序的数进行大小比较,一次比较两个元素,如果第一个数比第二个数大,则交换顺序,把第二个小的数放在前面,不断比较,直到形成一串由小到大排序的数字

时间复杂度:如果文件的初始状态是正序的 那么时间复杂度为O(n)

如果初始文件时反序的 那么时间复杂度是O(n的平方)

综上所述 冒泡排序总的平均时间复杂度为O(n的平方)

冒泡排序算法就是把小的元素往前调或者把大的元素往后调,比较相邻的两个元素的大小,交换也发生在这两个元素之间,所以如果两个元素相等,是不会再交换的,如果两个相等的元素没有相邻,那么即使通过前面的两两交换使两个元素相邻,这时也不会再交换,所以相同元素的前后顺序并没有改变,所以冒泡排序算法是一种稳定排序算法

测试代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_13_1 : MonoBehaviour
{
    void Start()
    {
        //测试数据
        int[] array = { 1, 4, 2, 43, 5, 61, 89, 34, 67, 32, 40 };
        //将数据排序
        PopSort(array);
        //排序后的数据
        for (int i = 0; i < array.Length; i++)
        {
            Debug.Log(array[i]);
        }
    }
    public void PopSort(int[] _item)
    {
        int i, j, temp;  //先定义一下要用的变量
        for (i = 0; i < _item.Length - 1; i++)
        {
            for (j = i + 1; j < _item.Length; j++)
            {
                if (_item[i] > _item[j])  //降序改为“<”
                {
                    //交换两个数的位置
                    temp = _item[i]; //把大的数放在一个临时存储位置
                    _item[i] = _item[j]; //然后把小的数赋给前一个
                    _item[j] = temp; //然后把临时位置的那个大数赋给后一个
                }
            }
        }
    }
}

二、选择排序算法

选择排序算法是一种简单直观的排序算法

首先从待排序的数据元素中选出最小或者最大的一个元素,存放到序列的起始位置,其次再从剩余的未排序元素中寻找到最小或者最大的一个元素,然后放到已排序的序列的末尾,以此类推,直到待排序的数据元素的个数为0

选择排序算法是不稳定的排序方法、

选择排序算法总的平均时间复杂度为O(n的平方)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_13_2 : MonoBehaviour
{
    void Start()
    {
        //测试数据
        int[] array = { 1, 4, 2, 43, 5, 61, 89, 34, 67, 32, 40 };
        //将数据排序
        SelectionSort(array);
        //排序后的数据
        for (int i = 0; i < array.Length; i++)
        {
            Debug.Log(array[i]);
        }
    }
    public void SelectionSort(int[] _item)
    {
        int i, j, min, len = _item.Length;
        int temp;
        for (i = 0; i < len - 1; i++)
        {
            min = i;
            for (j = i + 1; j < len; j++)
            {
                if (_item[min].CompareTo(_item[j]) > 0)
                {
                    min = j;
                }
            }
            temp = _item[min];
            _item[min] = _item[i];
            _item[i] = temp;
        }
    }
}

三、插入排序算法

插入排序是将一个记录插入已经排好序的有序表中,从而增加一个元素,有序表记录数+1,在其实现过程中,使用了双层循环,外层循环寻找第一个元素之外的所有元素,内层循环在当前有序表中根据当前元素进行插入位置查找,然后进行移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_13_3 : MonoBehaviour
{
    void Start()
    {
        //测试数据
        int[] array = { 1, 4, 2, 43, 5, 61, 89, 34, 67, 32, 40 };
        //将数据排序
        InsertSort(array);
        //排序后的数据
        for (int i = 0; i < array.Length; i++)
        {
            Debug.Log(array[i]);
        }
    }
    public void InsertSort(int[] _item)
    {
        for (int i = 1; i < _item.Length; i++)
        {
            int temp = _item[i];
            for (int j = i - 1; j >= 0; j--)
            {
                if (_item[j] > temp)
                {
                    _item[j + 1] = _item[j];
                    _item[j] = temp;
                }
            }
        }
    }
}

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
3天前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
10天前
|
机器学习/深度学习 算法 图形学
告别3D高斯Splatting算法,带神经补偿的频谱剪枝高斯场SUNDAE开源了
【5月更文挑战第26天】SUNDAE,一种结合频谱剪枝和神经补偿的高斯场方法,已开源,解决了3D高斯Splatting的内存消耗问题。SUNDAE通过建模基元间关系并剪枝不必要的元素,降低内存使用,同时用神经网络补偿质量损失。在Mip-NeRF360数据集上,SUNDAE实现26.80 PSNR和145 FPS,内存仅为104MB,优于传统算法。然而,其计算复杂性、参数优化及对其他3D表示方法的适用性仍有待改进。代码开源,期待进一步研究。[论文链接](https://arxiv.org/abs/2405.00676)
22 2
|
13天前
|
算法
循环嵌套思路详解 | 一个“在盒子里过家家”的算法 -- 以冒泡排序与打印菱形为例(二)
本文介绍了如何运用特定思路解析和解决编程问题,特别是涉及双层循环的情况。首先,通过一个打印特定图案的例子,解释了将“盒子”作为思考单位的概念,即分析问题中每个循环的作用和内容。接着,以冒泡排序为例,展示了如何将问题分解为外层循环(趟数)和内层循环(每趟的比较与交换),并通过盒子思路简化理解和实现代码。最后,提到了菱形打印的代码优化,鼓励读者思考并应用这种思维方式。总的来说,文章强调了自然地理解和运用循环结构,而不是机械地记忆。
33 2
|
13天前
|
算法
循环嵌套思路详解 | 一个“在盒子里过家家”的算法 -- 以冒泡排序与打印菱形为例(一)
本文介绍了编程中的一种思想,通过菱形打印问题来阐述如何理解和使用循环嵌套。文章提到,初学者在面对循环结构时,可以通过先识别代码块的结束括号来理解整体结构,提高阅读效率。作者提出了“在盒子里过家家”的理解思路,将外层循环看作一个个盒子,内层循环视为盒子里的操作,弱化循环嵌套的概念,强调以盒子为单位思考问题。此外,文章还通过示例解释了内外循环的关系,帮助读者更好地理解循环控制和执行过程。
35 3
|
22天前
|
算法 前端开发 搜索推荐
前端算法之插入排序
前端算法之插入排序
14 0
|
22天前
|
搜索推荐 Java
冒泡排序是一种简单的排序算法
【4月更文挑战第28天】Java实现的冒泡排序示例,通过遍历数列并比较相邻元素,当顺序错误时交换位置,多次迭代完成排序。主要包含bubbleSort函数,内部使用两层循环进行元素比较与交换,以及printArray函数用于打印排序结果。
24 1
|
22天前
|
搜索推荐 算法 Java
sort-05-insert sort 插入排序算法详解
这是一个关于排序算法的系列文章总结,包括冒泡排序、快速排序、选择排序、堆排序、插入排序等10种排序算法的详细讲解和Java实现。插入排序是一种简单直观的排序算法,通过构建有序序列并逐个插入新元素来排序。提供的Java代码展示了插入排序的实现过程,并附有测试示例。所有算法已开源在GitHub项目[https://github.com/houbb/sort](https://github.com/houbb/sort)中。
|
22天前
|
搜索推荐 算法 Java
sort-01-bubble sort 冒泡排序算法详解
这是一个关于排序算法的系列文章摘要。作者整理了10种不同的排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序和大文件外部排序。文章详细介绍了冒泡排序的工作原理、流程,并提供了代码实现,强调了在实现中考虑的改进点,如统一接口、实用性增强和日志输出。此外,还提供了一个排序接口和工具类以方便使用,并通过测试代码和日志展示了排序过程。整个系列旨在帮助读者理解和掌握排序算法。相关代码已开源在GitHub。
|
7天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
这是一个关于数字水印算法的摘要:使用MATLAB2022a实现,结合DCT和位平面分解技术。算法先通过DCT变换将图像转至频域,随后利用位平面分解嵌入水印,确保在图像处理后仍能提取。核心程序包括水印嵌入和提取,以及性能分析部分,通过PSNR和NC指标评估水印在不同噪声条件下的鲁棒性。
|
8天前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。