选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的中数据元素选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
一、选择排序基本原理
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
动画示例:
![](https://i-blog.csdnimg.cn/blog_migrate/c1d72f672ea053b7785fbf7ba24dac97.gif)
二、实现代码
将一列数从左到右从小到大排列。
代码如下(示例):
private static int[] selectionSort(int[] array)
{
int index;//记录极值索引
for (int i = 0; i < array.Length; i++)
{
index = i;//默认第一个为极值
for (int j = i+1; j < array.Length; j++)
{
//找出最小值并记录索引
if (array[index]>array[j])
{
index = j;
}
}
//判断极值索引是否为默认索引
//如果是则没必要交换
if (index != i)
{
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
}
return array;
}
注意:
index != i 判断索引位置与起始位置是否一致
总结
选择排序关键点:
两层循环,外循环决定排序轮数,内循环是依次比较大小找到最值并交换位置。
在选择排序中,每趟都会选出最大元素与最小元素,然后与两端元素交换,此时,待排序序列中如果存在与原来两端元素相等的元素,稳定性就可能被破坏。如[5,3,5,2,9],在array[0]与array[3]元素交换时,序列的稳定性就被破坏了,所以选择排序是一种不稳定的排序算法。
适用于待排序序列中,元素个数较少时。
时间复杂度为O(n^2)
空间复杂度O(1)