数据结构:简单选择排序
simple selection sort 通过n-i 次关键字的比较,从n – i +1 个记录中选择出关键字最小的记录,并和 第 i(1 ≤ i ≤ n) 个记录进行交换。
先看一遍代码:
void swap( Sqlist *L, int i , int j )
{
int temp =L -> r[i];
L -> r[i] = L -> r [j];
L -> r [j]= temp ;
}
void selectionsort ( sqlist *L )
{
int i , j ,min ;
for ( i =1 ;i < L-> length ; i ++)
{
min= i ;
#将当前下标定义成最小值下标
for( j = i +1 ; j <= L-> length ; j ++)
# 循环
{
if( L-> r[min] > L->r[j] )
#如果有比当前最小值还小的值,就将更小的关键字的下标赋值给min
min = j ;
}
if(i != min )
#如果min不等于 i 就说明在上一循环中找到了最小值
swap( L,i ,min );
#那么就将原先最小的值 交换成 后来更小的值
}
新手可能不是十分容易理解,举一个关键字序列 {9 ,1,5, 8}
关键字下标0 |
关键字下标1 |
关键字下标2 |
关键字下标3 |
关键字下标4 |
(空) |
9 |
1 |
5 |
8 |
一开始的时候,i = 1,那么min(最小值)就是1, j =2。第一次比较的情况是 r[1] 和r[2]比较,即9和1比较,很明显9更大一些,那么 min = 2,进入下一层循环。j = 3,r[min] =1 和r[j] = 5相比,很明显 r [min] 依旧比较小,不变,继续进行下一层循环,直至最后。
内部for ( j = i +1 ; j <= L->length ; j ++) 循环全部结束后,开始走出循环继续下一步,交换数值:
if (i != min ) 正确,进入函数,交换i (1)和 min(2)的值,变为:
关键字下标0 |
关键字下标1 |
关键字下标2 |
关键字下标3 |
关键字下标4 |
(空) |
1 |
9 |
5 |
8 |
此次循环结束后返回大循环 for ( i =1 ; i < L->length ; i ++) , 此时 i=2,,min =2 ,r[min] = 9, j = 2+1,r[j] = 5,进入for ( j = i +1 ; j <= L-> length ; j++) ,此轮循环结束后,字符串变为:
关键字下标0 |
关键字下标1 |
关键字下标2 |
关键字下标3 |
关键字下标4 |
(空) |
1 |
5 |
9 |
8 |
接着 i= 3 进入下一轮大循环,此轮结束后得出字符串:
关键字下标0 |
关键字下标1 |
关键字下标2 |
关键字下标3 |
关键字下标4 |
(空) |
1 |
5 |
8 |
9 |
到了最后,字符串就变成了:
关键字下标0 |
关键字下标1 |
关键字下标2 |
关键字下标3 |
关键字下标4 |
(空) |
1 |
5 |
8 |
9 |
所以现在返回去看开头的那段话“通过n-i 次关键字的比较,从n – i +1 个记录中选择出关键字最小的记录,并和 第 i(1 ≤ i ≤ n) 个记录进行交换”,其实就可以理解成:每次从剩下的记录中选择一个最小的数值拎出来,直至最终全都有序。
它需要比较的次数为 (n*(n-1)) / 2 ,即是 o(n²)。