【选择排序】简单选择排序

      选择排序的基本思想是:每一趟从待排序的记录选出关键字最小的记录,按顺序放在已排序的记录序列的最后,直到全部排完为止。
  简单选择排序(Simple Selection Sort)也称作直接选择排序。
[算法思想]

1)设待排序的记录存放在数组r[1..n]中。第一趟从r[1]开始,通过n-1次比较,从n个记录中选出关键字最小的记录,记为r[k],交换r[1]和r[k]。

2)第二趟从r[2]开始,通过n-2次比较,从n-1个记录中选出关键字最小的记录,记为r[k],交换r[2]和r[k]。

3)依次类推,第i趟从r[i]开始,通过n-i次比较,从n-i+1个记录中选出关键字最小的记录,记为r[k],交换r[i]和r[k]。

4)经过n-1趟,排序完成。

例 已知待排序记录的关键字序列为{9,0,5,3,7,8,4,2,10,1},给出用简单选择排序法进行排序的过程

  简单选择排序过程如下图所示,其中【】中为已排好序记录的关键字。

[算法描述]

void SelectSort(int r[],int Length)
{
	/* 对顺序r做简单选择排序 */
	int k,t;
	for(int i=1;i<Length-1;++i)         /* 在r[i..Length-1]中选择关键字最小的记录 */
	{
		k=i;
		for(int j=i+1;j<Length;++j)
		{
			if(r[j]<r[k]) k=j;        /* k指向此趟排序中关键字最小的记录 */
		}
		if(i!=k)                      /* 交换r[i]与r[k] */
		{
			t=r[i];
			r[i]=r[k];
			r[k]=t;
		}
	}
}  
[算法分析]

1.时间复杂度

  简单选择排序过程中,所需进行记录移动的次数较少。最好情况(正序):不移动;最坏情况(逆序):移动3(n-1)次。然而,无论记录的初始排列如何,所需进行的关键字间的比较次数相同,均为 KCN=n(n-1)/2=(n^2)/2。

  因此,简单选择排序的时间复杂度也是O(n^2)。

2.空间复杂度

  同冒泡排序一样,只有在两个记录交换时需要一个辅助空间,所以空间复杂度为O(1)。

[算法特点]

1)由于算法以“交换记录”来实现“字前最小记录到位”,就有可能改变关键字相同记录的前后顺序,使得原来稳点的排序方法产生“不稳定”想象。

2)可用于链式存储结构。

3)移动记录次数较少,当每一记录占用的空间较多时,此方法比直接插入排序快。

[完整代码]
#include<iostream>
using namespace std;
void SelectSort(int r[],int Length)
{
	/* 对顺序r做简单选择排序 */
	int k,t;
	for(int i=1;i<Length-1;++i)         /* 在r[i..Length-1]中选择关键字最小的记录 */
	{
		k=i;
		for(int j=i+1;j<Length;++j)
		{
			if(r[j]<r[k]) k=j;        /* k指向此趟排序中关键字最小的记录 */
		}
		if(i!=k)                      /* 交换r[i]与r[k] */
		{
			t=r[i];
			r[i]=r[k];
			r[k]=t;
		}
	}
}  
int main()
{
	int a[11]={0,9,0,5,3,7,8,4,2,10,1};  /* 从a[1]开始 */
	SelectSort(a,11);
	for(int i=1;i<11;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	return 0;
}
[运行结果]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值