C# 选择排序

栏目总目录


概念

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

原理

选择排序的基本思想是:第1趟,在待排序记录r1 ~ rn中选出最小的记录,将它与r1交换;第2趟,在剩下的记录r2 ~ rn中选出最小的记录,将它与r2交换;以此类推,第i趟在剩下的记录ri ~ rn中选出最小的记录,将它与ri交换,直到整个序列有序。

好处与不足

好处

  1. 稳定性:虽然选择排序本身不是稳定的(因为交换元素时可能破坏相等元素的相对顺序),但在某些特定实现中可以通过记录索引来保证稳定性,尽管这会增加实现的复杂度。
  2. 简单直观:算法逻辑清晰,容易理解和实现。
  3. 对输入数据不敏感:无论输入数据是否部分有序,选择排序的时间复杂度都是固定的。

不足

  1. 效率低:选择排序的时间复杂度为O(n^2),在处理大数据集时效率较低。
  2. 数据移动:选择排序在找到最小(或最大)元素后需要进行交换,这可能会涉及到大量数据的移动。

应用场景

选择排序由于其简单性,在数据量不大或对数据稳定性要求不高的情况下可以使用。然而,在数据量较大或对数据排序效率有较高要求时,通常不会选择选择排序。

示例代码

基本实现

csharp 复制代码
public void SelectionSort(int[] arr)
{
    int n = arr.Length;
    for (int i = 0; i < n - 1; i++)
    {
        // 找到[i, n)区间里的最小值的索引
        int minIndex = i;
        for (int j = i + 1; j < n; j++)
        {
            if (arr[j] < arr[minIndex])
            {
                minIndex = j;
            }
        }
        // 将找到的最小值交换到前面
        int temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}

泛型实现

为了增加代码的复用性,我们可以使用泛型来实现选择排序,使其能够排序任何实现了IComparable<T>接口的类型。

csharp 复制代码
public void SelectionSort<T>(IList<T> list) where T : IComparable<T>
{
    int n = list.Count;
    for (int i = 0; i < n - 1; i++)
    {
        int minIndex = i;
        for (int j = i + 1; j < n; j++)
        {
            if (list[j].CompareTo(list[minIndex]) < 0)
            {
                minIndex = j;
            }
        }
        T temp = list[minIndex];
        list[minIndex] = list[i];
        list[i] = temp;
    }
}

总结

选择排序是一种简单直观的排序算法,它通过不断选择剩余元素中的最小(或最大)元素来逐步构建有序序列。尽管其时间复杂度较高,但在数据量不大或对排序效率要求不高的情况下,选择排序仍然是一个可行的选择。通过理解选择排序的原理和特性,我们可以更好地选择和使用适合特定场景的排序算法。

相关推荐
闻缺陷则喜何志丹10 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin29 分钟前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿44 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd44 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人2 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法