排序思想
选择排序: 每次从当前待排序的记录中选取关键字最小的记录表,然后与待排序的记录序列中的第一个记录进行交换,直到整个记录序列有序为止。
直接选择排序,也叫简单选择排序。
基本操作:通过n-i次关键字间的比较,从n-i+1个记录中选取关键字最小的记录,然后和第i个记录进行交换,i=1, 2, … n-1 。
排序示例
设有关键字序列为:7, 4, -2, 19, 13, 6,直接选择排序的过程如下图1所示。
算法实现
void simple_selection_sort(int value[], int length)
{
int i, j, k;
int tmp = 0;
for(i=0; i<length; i++)
{
k = i;
for(j=i+1; j<length; j++)
if(value[j] < value[k])
k = j;
if(k != i) /* 记录交换 */
{
tmp = value[i];
value[i] = value[k];
value[k] = tmp;
}
}
}
算法分析
整个算法是二重循环:外循环控制排序的趟数,对n个记录进行排序的趟数为n-1趟;内循环控制每一趟的排序。
进行第i趟排序时,关键字的比较次数为n-i,则:
比较次数:
∴ 时间复杂度是:T(n)=O(n2)
空间复杂度是:S(n)=O(1)
从排序的稳定性来看,直接选择排序是不稳定的。