选择排序的基本思想:每次都从待排序的文件中选择出排序码最小的记录,将该记录放于已排序文件的最后一个位置,直到已排序文件记录个数等于初始待排序文件的记录个数位置。 这种思路导致的结果便是排出来的序列为从大到小;
选择排序主要分:
1. 直接选择排序
2. 树形选择排序
3. 堆排序
直接选择排序
直接选择排序是一种简单的方法,首先从所有的n个待排序的记录中选择排序码最小的记录,将该记录与第一个记录交换,再从剩下的n-1个记录中选择最小的记录与第二个记录做交换。一次循环,知道剩下两个记录时,再从中选出最小的记录与第n-1个记录交换。剩下的那一个记录肯定是最大的记录。
当选出来的i-1个记录放在前i-1个位置,接下来从剩余的n-(i-1)个记录中选出最小的记录与第i个记录交换。这里只要设置一个变量记下在查找过程中最小记录的位置,知道查完n-(i-1)个记录。只要最小的位置不为i,就将最小的排序码对应的记录与第i个记录交换;
void simpleSelectSort(table *tab){
int i ,j,k;
for(i=1;i<=tab->length-1;i++)//每次选择一个最小的位置,并与第i个位置交换
{
k=i; //用于记录下最小记录的位置
for(j=i+1;j<tab->length;j++)//向右查找更小的记录
{
if(tab->r[j].key<tab->tab->r[k].key)
k=j; //如果有更小的记录,更改k的位置
}
if(k!=i) //只要最小的位置不为i,就将最小的排序码对应的记录与第i个记录交换;
{
tab->r[0]=tab->r[k]; //用没有使用的0记录来作为交换的中介
tab->r[k]=tab->r[i];
tab->r[i]=tab->r[0];
}
}
}
直接选择排序
时间复杂度 O(N^2). 使用一个存储记录的附加空间
不稳定;