简单选择排序

基本思路:

通过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)



虽然时间复杂度和冒泡排序相同,但其性能上稍优于冒泡排序





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值