基本思路:
通过n-i次的关键字比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换
算法所需结构:
#define MAX 10
//排序所用的顺序表结构
typedef struct
{
int a[MAX+1]; //存储排序数组,a[0]用作临时变量
int length; //记录顺序表的长度
}Sqlist;
//交换
void swap(Sqlist *L,int i,int j)
{
int t=L->a[i];
L->a[i]=L->a[j];
L->a[j]=t;
}
算法代码:
//简单选择排序
void Selectsort(Sqlist *L)
{
int i,j,min;
for(i=1;i<L->length;i++)
{
min=i;
for(j=i+1;j<=L->length;j++) //j=i+1
{
if(L->a[min]>L->a[j])
min=j;
}
if(min!=i) //注意这个判断
swap(L,i,min);
}
}
先不断地改变min的值,最后只执行一次swap函数(每次执行完内循环后)
复杂度
特点:数据的交换移动次数少
时间复杂度:无论最好最坏情况,比较次数一致,第i次排序要进行n-i次关键字比较,此时需要比较:
n-1+n-2+...+1=n*(n-1)/2 次
交换次数:最好,0次;最坏,n-1次
最终的排序时间是比较与交换的次数总和,总的时间复杂度为O(n^2)
虽然时间复杂度和冒泡排序相同,但其性能上稍优于冒泡排序