C#实现选择排序

下面是详细讲解“C#实现选择排序”的完整攻略。

选择排序的算法原理

选择排序(Selection Sort)是一种简单直观的排序算法。其算法思想是将待排序序列分成已排序和未排序两个部分,每次从未排序的元素中选择最小(或最大)的元素,放到已排序的序列末尾。重复这个过程,直到所有元素都排序完毕。

C#实现选择排序的步骤

实现选择排序的过程有以下几个步骤:

  1. 定义待排序的数组,确定数组的长度,使用循环语句取出数组中的每个元素;
  2. 再使用一个循环语句,在未排序部分找到最小的元素,并记录其下标;
  3. 通过交换元素的方式,将已排序部分的最后一个元素和未排序部分中的最小元素位置互换;
  4. 重复第2、3步,直到未排序的元素为 0 个,整个数组排序完毕。

下面我们来看一下其中的代码实现。

C#代码实现

public static void SelectionSort(int[] arr)
{
    int len = arr.Length;
    for (int i = 0; i < len - 1; i++)
    {
        int minIndex = i;
        for (int j = i + 1; j < len; j++)
        {
            if (arr[j] < arr[minIndex])
            {
                minIndex = j;
            }
        }
        if (minIndex != i)
        {
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

代码解释:

  1. 定义一个静态方法 SelectionSort 来对整型数组进行排序;
  2. 拿到待排序数组的长度,使用双重循环,外层的循环来确定已排序部分的长度,内层循环则是用来找到最小的元素;
  3. 如果找到了比当前下标元素值更小的元素,通过记录 minIndex 的方式来保存这个元素的下标;
  4. 判断minIndex 是否等于已排序的边界,如果不等,则通过另一个变量 temp 来交换两个位置的元素值。

下面演示一下算法执行过程:

例如,我们要对数组 [2, 6, 4, 3, 1, 5, 8, 9, 7] 进行排序。

  1. 在第一次循环中,选择最小的元素 1,将其与第一个元素 2 互换位置,数组变为 [1, 6, 4, 3, 2, 5, 8, 9, 7]
  2. 第二次循环中,选择最小的元素 2,将其与第二个元素 6 互换位置,数组变为 [1, 2, 4, 3, 6, 5, 8, 9, 7]
  3. 依次类推,直到排序完成,最终结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9]

示例说明

下面提供两个示例,分别是排序一个长度为 10 的数组和一个长度为 100 的数组。

示例1:排序一个长度为 10 的数组

int[] arr = new int[] { 2, 6, 4, 3, 1, 5, 8, 9, 7, 10 };
SelectionSort(arr);
Console.WriteLine("排序后的数组为:");
foreach (var item in arr)
{
    Console.Write(item + " ");
}

输出结果为:

排序后的数组为:
1 2 3 4 5 6 7 8 9 10

示例2:排序一个长度为 100 的数组

int[] arr = new int[100];
Random rand = new Random();
for (int i = 0; i < arr.Length; i++)
{
    arr[i] = rand.Next(0, 1000);
}
Console.WriteLine("排序前的数组为:");
foreach (var item in arr)
{
    Console.Write(item + " ");
}
SelectionSort(arr);
Console.WriteLine("\n排序后的数组为:");
foreach (var item in arr)
{
    Console.Write(item + " ");
}

输出结果为:

排序前的数组为:
491 876 883 502 650 350 727 551 4 935 790 362 348 997 505 372 963 266 529 345 796 125 23 250 544 819 454 902 941 73 776 485 453 188 742 43 613 464 708 425 270 888 971 218 107 414 4 856 672 284 49 515 535 150 304 817 863 878 593 996 546 826 571 102 303 520 758 206 325 76 842 442 606 13 64 103 237 703 778 348 997 779 428 125 192 646 485 551 464 789 260 222 425 427 26 571 758 827 441 516 476 927 895 558 410 619 209 377 496 785 473 
排序后的数组为:
4 4 13 23 26 43 49 64 73 76 102 103 107 125 125 150 188 192 206 209 218 222 237 250 260 266 270 284 303 304 325 345 348 348 350 362 372 377 410 414 425 425 427 428 441 442 453 454 464 464 473 476 485 485 496 502 515 516 529 535 544 546 551 551 558 571 571 593 606 613 619 646 650 672 703 708 727 742 758 758 776 778 779 785 789 790 796 817 819 826 827 842 856 863 876 878 883 888 895 902 927 935 941 963 971 996 997 997 

总结

以上就是C#实现选择排序的详细攻略,选择排序虽然简单直观,但其时间复杂度为O(n^2),在面对大量数据时性能不佳,不适用于大规模的排序应用。如果需要面对大数据量的排序,应该优先选择更快速、更优化的算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现选择排序 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C#定时器实现自动执行的方法

    下面来详细讲解一下C#定时器实现自动执行的方法。 一、什么是定时器 在C#中,定时器是一种常用的机制,也就是周期性执行某个指定代码,定时器通常用于需要周期性执行某些操作的场景,例如轮询某个接口获取数据、定时备份数据、定时刷新界面等。在C#中,常用的定时器包括System.Timers.Timer、System.Threading.Timer、System.W…

    C# 2023年6月6日
    00
  • C#使用SqlDataAdapter对象获取数据的方法

    下面详细讲解一下“C#使用SqlDataAdapter对象获取数据的方法”的完整攻略: 1. 准备工作 在使用SqlDataAdapter对象获取数据之前,需要先引用System.Data.SqlClient库。可以通过在程序代码中添加以下语句实现: using System.Data.SqlClient; 同时需要准备好连接数据库所需的参数,例如服务器名称…

    C# 2023年5月31日
    00
  • C# 正则表达式 使用介绍

    C# 正则表达式使用介绍 什么是正则表达式 正则表达式是一种用来描述字符串模式的表达式。它可以用来匹配、查找、替换文本中的字符串,非常适用于数据处理、文本分析等方面。正则表达式的写法非常灵活,可以使用特定的符号来表示文本中的各种模式,并且可以进行组合、嵌套等操作。 C#中的正则表达式 C#中正则表达式的使用由System.Text.RegularExpres…

    C# 2023年6月7日
    00
  • .NET中堆栈和堆的特点与差异介绍

    在.NET中,堆和栈是两种常见的内存分配方式。堆和栈的特点和差异如下: 堆的特点 堆是一种动态分配的内存区域,用于存储对象和数据结构。 堆的大小可以动态增长或缩小,由垃圾回收器负责管理。 堆中的对象可以通过引用来访问,引用是指向对象在堆中的地址。 堆中的对象可以被多个线程共享。 堆中的对象的生命周期由垃圾回收器来管理。 栈的特点 栈是一种静态分配的内存区域,…

    C# 2023年5月17日
    00
  • C#中SQL参数传入空值报错解决方案

    我们先从问题的背景说起:在使用C#编写带参数的SQL查询时,如果参数的值为null或者DBNull.Value,会出现“System.ArgumentNullException: Value cannot be null”的异常。接下来,我将介绍几种解决方案来避免这个问题。 方案一:使用IFNULL()函数 在SQL语句中使用IFNULL()函数可以在参数值…

    C# 2023年5月14日
    00
  • C#事件标准命名规则及说明(包括用作事件类型的委托命名)

    下面是关于“C#事件标准命名规则及说明(包括用作事件类型的委托命名)”的完整攻略。 1. 事件标准命名规则 1.1 委托命名 在C#中,常用委托命名作为事件的类型,因此委托的命名很关键。根据Microsoft官方文档的建议,委托命名应该基于事件的名称以及命名以EventHandler结尾。例如,声明一个叫做“ButtonClick”的事件,应该使用以下的委托…

    C# 2023年5月15日
    00
  • PC蓝牙通信C#代码实现

    下面将详细讲解“PC蓝牙通信C#代码实现”的完整攻略: 1. 前置知识 在开始进行PC蓝牙通信C#代码实现之前,需要了解以下前置知识: C#编程语言基础知识。 .NET Framework类库中与蓝牙通信相关的命名空间和类,例如System.IO.Ports和System.Threading等。 能够使用C#编写简单的串口通信程序。 掌握蓝牙通信协议和通信方…

    C# 2023年6月6日
    00
  • ASP实现加法验证码

    实现加法验证码的过程可以分为以下几个步骤: 步骤一:生成加法算式 我们需要在服务器端生成一道简单的加法算式作为验证码,同时将其保存在会话(session)中,方便后续验证操作的进行。代码片段如下: <% Dim num1, num2, code Randomize ‘初始化随机数生成器 num1 = Int(Rnd() * 10) ‘生成0~9之间的随…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部