C# 实现选择排序

C# 实现选择排序

过程拆解

假设现有一数组,如下

在这里插入图片描述
基本排序代码如下

static void Main(string[] args)
{
    int[] array = new int[] { 3, 5, 6, 2, 3, 8, 1 };//替换代码
    BaseSort(array, 0, 6);//替换代码
    
    for (int i = 0; i < array.Length; i++)
    {
        Console.Write(array[i] + " ");
    }
    
    Console.WriteLine();
    Console.ReadKey();
}

public static void BaseSort(int[] array, int start, int end)
{
    int minIndex = start;
    
    for (int i = start + 1; i <= end; i++)
    {
        if (array[minIndex] > array[i])
        {
            minIndex = i;
        }
    }

    if (minIndex != start)
    {
        int temp = array[start];
        array[start] = array[minIndex];
        array[minIndex] = temp;
    }
}
  1. 替换代码换成下列代码,并输出数组
int[] array = new int[] { 3, 5, 6, 2, 3, 8, 1 };
BaseSort(array, 0, 6);
//以下标0的值为最小值,从下标 0 + 1 到下标6寻找唯一更小值,然后与最小值进行互换

在这里插入图片描述

  1. 替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 5, 6, 2, 3, 8, 3 };
BaseSort(array, 1, 6);
//以下标1的值为最小值,从下标 1 + 1 到下标6寻找唯一更小值,然后与最小值进行互换

在这里插入图片描述

  1. 替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 6, 5, 3, 8, 3 };
BaseSort(array, 2, 6);
//以下标2的值为最小值,从下标 2 + 1 到下标6寻找唯一更小值,然后与最小值进行互换

在这里插入图片描述

  1. 替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 3, 5, 6, 8, 3 };
BaseSort(array, 3, 6);
//以下标3的值为最小值,从下标 3 + 1 到下标6寻找唯一更小值,然后与最小值进行互换

在这里插入图片描述

  1. 替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 3, 3, 6, 8, 5 };
BaseSort(array, 4, 6);
//以下标4的值为最小值,从下标 4 + 1 到下标6寻找唯一更小值,然后与最小值进行互换

在这里插入图片描述

  1. 替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 3, 3, 5, 8, 6 };
BaseSort(array, 5, 6);
//以下标5的值为最小值,从下标 5 + 1 到下标6寻找唯一更小值,然后与最小值进行互换

在这里插入图片描述
至此,数组的值按从小到大进行排列。

算法实现

  1. 选择算法每一次排序,会选择最小(最大)的值放在最前面。总共要选择并放置 array.Length - 1 次。
  2. 第一次选择,选择下标 0当前最小(大)值,从下标 0 + 1 到数组尾部下标 array.Length - 1 找出最小(大)值,如果比当前最小值还小(大),就进行互换。
  3. 第二次选择,选择下标 1当前最小(大)值,从下标 1 + 1 到数组尾部下标 array.Length - 1 找出最小(大)值,如果比当前最小值还小(大),就进行互换。
  4. 第三次选择,选择下标 2当前最小(大)值,从下标 2 + 1 到数组尾部下标 array.Length - 1 找出最小(大)值,如果比当前最小值还小(大),就进行互换。

代码如下

static void Main(string[] args)
{
    int[] array = new int[] { 3, 5, 6, 2, 3, 8, 1 };
    SelectionSort(array);
    
    for (int i = 0; i < array.Length; i++)
    {
        Console.Write(array[i] + " ");
    }
    
    Console.WriteLine();
    Console.ReadKey();

}

//选择排序
public static void SelectionSort(int[] array)
{
    for(int i = 0; i < array.Length - 1; i++)
    {
        int minIndex = i;
        for(int j = i + 1; j < array.Length; j++)
        {
            if(array[minIndex] > array[j])
            {
                minIndex = j;
            }
        }
        
        if(minIndex != i)
        {
            int temp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = temp;
        }
    }
}

复杂度与稳定性

在这里插入图片描述

  • 最优时间复杂度:数组已经排序完成,但是还是要进行两个 for循环 进行比较
  • 最差时间复杂度:数组倒序排序,需要进行两个 for循环 进行比较
  • 平均时间复杂度:最优与最差都是O(n2),所以平均也是O(n2)
  • 空间复杂度:需要借助 temp 变量用来交换数组中的两个值。
  • 不稳定性:经过选择算法后,后面的数被排在了前面(例如: 3)

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。

你可能感兴趣的:(数据结构与算法,算法,数据结构,c#)