在上篇博客中,已经详细介绍了插入排序和交换排序,下面会主要介绍选择排序。选择排序基本思想:每一次在n-i+1(i=1,2… ,n-1)个记录中选取键值最小的记录作为有序序列的第i个记录。这个排序中我们主要应用的还是直接选择排序和堆排序两种选择排序方法。
一、直接选择排序
基本思想:在第i次选择操作中,通过n-i次键值间比较,从n-i+1个记录选出键值最小的记录,并和第i个记录交换。算法描述如下:
void SelectSort(List R,int n)
{
Int min,i,j;
for(i=1;i<=n-1;i++) //每次循环,选择出一个最小键值
{
min=i; //假设第i个记录键值最小
for(j=i+1;j<=n;j++)
{
if (R[j].key<R[min].key) min=j; //记录下键值较小记录的下标
if(min!=i) swap(R[min],R[i]); //将最小键值记录和交换第i个记录交换
}
}
}
上述算法中,函数swap(R[min],R[i])是将记录R[min]和R[i]交换。
直接选择排序过程示例:
初始关键字 [45 38 66 90 88 10 25 45]
第一次选择 10 [38 6690 88 45 25 45]
第二次选择 10 25 [6690 88 45 38 45]
第三次选择 10 25 38[90 88 45 66 45]
第四次选择 10 25 3845 [88 90 66 45]
第五次选择 10 25 3845 45 [90 66 88]
第六次选择 10 25 3845 45 66 [90 88]
第七次选择 10 25 3845 45 66 88 [90]
排序结果 10 25 38 45 45 66 88 90
这个算法的时间复杂度为O(n2).算法简单,容易实现,但是不适宜n较大的情况。同时值得注意的,直接选择排序是不稳定的。
二、堆排序
未完待续...