选择排序的基本思想:
每一趟在数个记录里选取关键字最小的记录作为有序序列的第i个记录。实现代码如下:
void SelectSort(int a[], int n)
{
int k, temp;
for (int i =0 ; i < n - 1; ++i)
{
k = i;
for (int j = i + 1; j < n; ++j)
{
if (a[k] > a[j])
{
k = j;
}
}
if (k != i)
{
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
从简单排序的实现过程来看,与冒泡算法相比,最大的特点就是移动数据次数相当少。
时间复杂度:
无论是最差还是最好的情况,选择排序比较的次数都一样多,第i趟需要比较n-i次,总共需要比较n-1+n-2+...+1 = n(n-1)/2次。最好的情况时交换的次数为0,最差的时候,交换的次数为n-1次,基于最终的交换次数和比较次数,因此总的时间复杂度为O(n^2)。尽管与冒泡排序同样的时间复杂度,但是简单选择排序的性能还是略优于冒泡排序。
稳定性:
选择排序在每一趟中选择最小的数据与第一个位置的数据交换,以此类推,直到n-1个元素,如果在某一趟中,若有一个元素比当前元素小,而此时在该元素的前面又有一个和当前元素相等的元素,交换完成后,序列的稳定性就被破坏了。比如,有序列5,4,5,3,6在第一趟结束后,第一个位置的5会和3交换,那么原序列中的两个5的相对前后顺序就被破坏了,因此简单选择排序是一个不稳定的排序算法。