简单选择排序法就是通过 n - i 次关键字间的比较,从 n - i + 1个记录中选出关键字最小的记录,并和第 i 个记录交换。
代码如下:
void SelectSort(SqList *L)
{
int i,j,min,k;
for(i = 0;i<(L->length-1);i++)
{
min = i; //将当前下标设置为最小值下标
for(j = i+1;j < (L->length);j++);
{
if((L->r[min]) > (L->r[j])) //如果有小于当前最小值的关键字
min = j; //将次关键字的下标赋值给min
}
if(i != min) //若min != i ,说明找到最小值,进行交换
swap(L,i,min);
}
}
代码应该说不难理解,针对待排序的关键字序列为{9,1,5,8,3,7,4,6,2};对 i 从0循环到7,当i = 0时,L.r[i] = 9,min开始为0,然后与 j = 2到9比较L.r[min]与L.r[j]的值,因为j = 2时最小,所以min = 2,最终交换了L.r[0]和L.r[1]的值,这里虽然比较了8次,但数据只交换了一次。
当 i = 1 时,L.r[i] = 9,min 开始是1,经过比较后,min = 9,交换L.r[1]和L.r[min]的值,这样就找到了第二位置的关键字,之后数据的比较与交换与上面完全相同,最多完成8次交换即可完成排序工作。
简单选择排序的复杂度:
对于交换次数而言,当最好的时候,交换为0次,最差的时候交换为n - 1次。对于比较次数而言为(n*(n - 1)/2),由于最终的排序时间是比较与jioa交换次数的总和,因此总的总的时间复杂度为O(n*n).