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;
}
}
- 将替换代码换成下列代码,并输出数组
int[] array = new int[] { 3, 5, 6, 2, 3, 8, 1 };
BaseSort(array, 0, 6);
//以下标0的值为最小值,从下标 0 + 1 到下标6寻找唯一更小值,然后与最小值进行互换
- 将替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 5, 6, 2, 3, 8, 3 };
BaseSort(array, 1, 6);
//以下标1的值为最小值,从下标 1 + 1 到下标6寻找唯一更小值,然后与最小值进行互换
- 将替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 6, 5, 3, 8, 3 };
BaseSort(array, 2, 6);
//以下标2的值为最小值,从下标 2 + 1 到下标6寻找唯一更小值,然后与最小值进行互换
- 将替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 3, 5, 6, 8, 3 };
BaseSort(array, 3, 6);
//以下标3的值为最小值,从下标 3 + 1 到下标6寻找唯一更小值,然后与最小值进行互换
- 将替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 3, 3, 6, 8, 5 };
BaseSort(array, 4, 6);
//以下标4的值为最小值,从下标 4 + 1 到下标6寻找唯一更小值,然后与最小值进行互换
- 将替换代码换成下列代码,并输出数组
int[] array = new int[] { 1, 2, 3, 3, 5, 8, 6 };
BaseSort(array, 5, 6);
//以下标5的值为最小值,从下标 5 + 1 到下标6寻找唯一更小值,然后与最小值进行互换
至此,数组的值按从小到大进行排列。
算法实现
- 选择算法每一次排序,会选择最小(最大)的值放在最前面。总共要选择并放置 array.Length - 1 次。
- 第一次选择,选择下标 0 为当前最小(大)值,从下标 0 + 1 到数组尾部下标 array.Length - 1 找出最小(大)值,如果比当前最小值还小(大),就进行互换。
- 第二次选择,选择下标 1 为当前最小(大)值,从下标 1 + 1 到数组尾部下标 array.Length - 1 找出最小(大)值,如果比当前最小值还小(大),就进行互换。
- 第三次选择,选择下标 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)
因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。