选择排序的基本思想是:每一趟从待排序的记录选出关键字最小的记录,按顺序放在已排序的记录序列的最后,直到全部排完为止。
简单选择排序(Simple Selection Sort)也称作直接选择排序。
[算法思想]
简单选择排序(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;
}
[运行结果]