vlambda博客
学习文章列表

数据结构:简单选择排序

 

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²)。