算法描述
第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
实现代码
int main()
{
int a[10] = {3,2,1,6,5,4,7,8,9,0};
int i,j,k;
int key;
for(i = 0; i < 9; i++) //扫描n-1次就行
{
key = a[i]; //记录当前要插入的位置上的数
for(j = i + 1; j < 10; j++)
{
if(key > a[j])
{
key = a[j]; //最小值赋值给key
k = j; // 记录未排序序列每次扫描最小值的下标
}
}
a[k] = a[i]; //把未排序序列的最小值安插在已排序序列的最后面
a[i] = key;
for(k = 0; k < 10; k++) //打印排序过程
{
cout << a[k] << " ";
}
cout << endl;
}
return 0;
}
运行结果
![](http://static.oschina.net/uploads/space/2014/1225/192809_ZZJB_188860.png)
复杂度
在直接选择排序中,共需要进行n-1次选择和交换,每次选择需要进行 n-i 次比较 (1<=i<=n-1),而每次交换最多需要3次移动,因此,总的比较次数C=1/2(n*(n - 1)),
总的移动次数 3(n-1).由此可知,直接选择排序的时间复杂度
为 O(n2) (n的平方)
。
稳定性
在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么 交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。由于在直接选择排序中存在着不相邻元素之间的互换,因此,直接选择排序是一种不稳定的排序方法。