算法回顾之简单选择排序
概述
选择排序分为简单选择排序和堆排序,可以说,简单选择排序是最简单的排序算法之一,它十分直观,易懂,但同时,它也是能力十分强大 的堆排序的基础。
思路
简单选择排序的思路十分简单,大致如下:
每次从未排序序列中找到权值最大(最小)的项,把它放到未排序序列的最前面,或者说已排序序列的最后面,即和未排序的第一个元素互换。重复执行,知道整个序列有序。
以从小到大排序为例,考虑下面这个序列:
2 8 7 9 3 6 1
一共七个数
第一趟: 找到最小的数1
,把它和无序序列的首个互换,构成序列 1 | 8 7 9 3 6 2
(|
分割已排序和未排序序列,后面相同)
第二趟: 最小的数2,和8互换,此时序列为 1 2 | 7 9 3 6 8
第三趟: 找到最小的数3,和7互换,变成 1 2 3 | 9 7 6 8
第四趟: 找到最小的数6,和9互换,变成 1 2 3 6 | 7 9 8
第五趟: 找到最小的数7,无需变动,变成 1 2 3 6 7 | 9 8
第六趟:找到最小的数8,和9互换,变成 1 2 3 6 7 8 | 9
此时已经有序
实现
选择排序比较简单,直接上代码
#include<iostream>
#define MAXN 100
using namespace std;
void Selectsort(int a[],int n)
{
int i,j;
for(i=1;i<n;i++)
{
int minn=i;
for(j=i+1;j<=n;j++)
//找到无序序列中的最小值
if(a[j]<a[minn]) minn=j;
//如果最小值和无序序列的第一个元素不等,则互换
if(minn!=i) {a[0]=a[i];a[i]=a[minn];a[minn]=a[0];}
}
}
int main()
{
int n,a[MAXN];
int i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
Selectsort(a,n);
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
复杂度分析
空间复杂度
数组首位放空,作为保存最小值的中介。
空间复杂度为
O(1)
时间复杂度
最好情况和最坏情况均要比较 ∑n−1i=1n−i 次
最好情况,移动次数为 0 次
最坏情况,移动
时间复杂度为 O(n2)
Tip:还有另一种选择排序,堆排序