C#中实现冒泡排序、直接插入排序和选择排序

目录

1、冒泡排序

2、直接插入排序

3、选择排序


1、冒泡排序

        排序数组元素的过程总是小数往前放,大数往后放,类似水中气泡往上升的动作,所以称作冒泡排序。 

        冒泡算法由双层循环实现,其中外层循环用于控制排序轮数,一般是要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内层循环主要用于对比数组中每个临近元素的大小,以确定是否交换位置,对比和交换次数以排序轮数而减少

//冒泡排序,结果是由小到大的排列
//下一次循环是对数组中其他的元素进行类似操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test7_9
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args is null)                               //解除IDE0060
            {
                throw new ArgumentNullException(nameof(args));
            }
            int[] arr = new int[] { 63, 4, 24, 1, 3, 15 };  //定义一维源数组,并赋值            
            int j, temp;                                    //定义数组下标j和局部缓存变量
            for (int i = 0; i < arr.Length - 1; i++)        //外循环,i是循环次数
            {
                j = i + 1;
            id:                                             //定义标识,用于循环地执行内循环
                if (arr[i] > arr[j])                        //如果arr[i] > arr[j],则交换(小数放在数组前面)
                {
                    temp = arr[i];                          //每层外循环确定本层的最小数并放在数组最左边
                    arr[i] = arr[j];						
                    arr[j] = temp;						    
                    goto id;								//返回标识,if后因为交换过了不满足>条件,所以执行else
                }
                else
                    if (j < arr.Length - 1)					//否则,只要不是执行到最后一个元素
                    {
                        j++;							    //就j++
                        goto id;                            //返回标识,继续判断arr[i] > arr[j]
                }
            }
            foreach (int n in arr)							//循环遍历排序后的数组元素并输出
                Console.Write(n + " ");
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}
/*运行结果:
1 3 4 15 24 63  */

2、直接插入排序

        直接插入排序是一种最简单的排序方法,其基本操作是将一个记录插入已排好序的有序表中,从而得到一个新的、记录数增1的有序表,然后再从剩下的关键字中选取下一个插入对象,反复执行直到整个序列有序

//直接插入排序
//由小到大排序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test4_10
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args is null)                               //解除IDE0060
            {
                throw new ArgumentNullException(nameof(args));
            }
            int[] arr = new int[] { 63, 4, 24, 1, 3, 15 };  //定义源数组,并赋值
            for (int i = 0; i < arr.Length; ++i)            //遍历arr
            {
                int temp = arr[i];                          //定义局部变量temp,插入值
                int j = i;
                while ((j > 0) && (arr[j - 1] > temp))      //只要前面的大于temp,而且也一定至少满足1次
                {
                    arr[j] = arr[j - 1];                    //满足条件的前提下,j的每次循环,都把前面的数向后右移一次
                    --j;                                   
                }
                arr[j] = temp;                              //直到不满足条件时跳出while,arr[j] = temp,插入新值完毕
            }
            Console.WriteLine("排序后结果为:");
            foreach (int n in arr)                          //循环遍历排序后的数组
                Console.Write("{0}", n + " ");
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}
/*运行结果:
排序后结果为:
1 3 4 15 24 63  */

3、选择排序

        选择排序方法的排序速度要比冒泡排序快一些,也是常用的排序算法。

        选择排序的基本思想是将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从第一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。

//选择排序:对数组中的元素从小到大进行排序
//IDE0180:使用元組交換值 - .NET | Microsoft Learn
//https://learn.microsoft.com/zh-tw/dotnet/fundamentals/code-analysis/style-rules/ide0180

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test7_11
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args is null)                               //解除IDE0060
            {
                throw new ArgumentNullException(nameof(args));
            }
            int[] arr = new int[] { 63, 4, 24, 1, 3, 15 };  //源数组并赋值
            int min;									    //局部变量,每次选择排序中的最小值的索引
            for (int i = 0; i < arr.Length - 1; i++)		//遍历数组
            {
                min = i;								    //排序最小值的索引min最开始假设为i
                for (int j = i + 1; j < arr.Length; j++)	//循环访问数组中的元素值(除第一个)
                {
                    if (arr[j] < arr[min])					//倘若索引i后面的元素值arr[j] < arr[min]
                        min = j;                            //就修改最小值的索引min为j
                }
                //int t = arr[min];							//定义一个int变量,用来存储比较大的数组元素值,
                //arr[min] = arr[i];						//将小的数组元素值移动到前一位
                //arr[i] = t;								//将int变量中存储的较大的数组元素值向后移
                (arr[i], arr[min]) = (arr[min], arr[i]);    //解除IDE0180使用元组交换值,并注释掉上3行,对应地交换索引位置的数据元素值
            }                                               //如果一开始arr[i]就是最小值,那么if不满足条件,min永远也!=j,元祖交换自己等效于不交换
            Console.WriteLine("排序后结果为:");
            foreach (int n in arr)							//遍历显示输出新数组
                Console.Write("{0}", n + " ");
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}
/*运行结果:
排序后结果为:
1 3 4 15 24 63  */

猜你喜欢

转载自blog.csdn.net/wenchm/article/details/131457277