简介
英文名:Select Sort
是选择排序中最简单的算法
步骤
以下用数组2,5,8,3,6,9,1,4,7为例
从小到大排序
1.在未排序部分找到最小的那个数
- 一开始当作全部乱序,从乱序第一个开始找
- 找到最小数1
2.看找到的最小数的位置,如果不是未排序部分的第一个,就将它和第一个交换
- 现在1不是第一个,所以我们把它和2交换位置
3.重复前两步直到所有数排序完毕
-
1已经排好,所以接下来从第二个数开始是乱序部分,从第二个数开始重复前两步
-
找到最小数2
- 和前面数交换
- 继续
后面步骤也很简单,不再给出
代码
- 首先我们需要进行n-1次遍历去排每一个数(只剩最后一个数不用排)
- 用一个k去记录当前乱序部分最小数的下标
- 从第二个数开始遍历找最小数,与k 所标记的数比较
- 如果最小数下标不是乱序第一个,交换两个数
#include<bits/stdc++.h>
using namespace std;
void SelectSort(int a[],int len)
{
int k;
for(int i=0;i<len-1;i++)//未排序第一个数
{
k=i;//取第一个数
for(int j=i+1;j<len;j++)//遍历未排序部分
if(a[j]<a[k])
k=j;//取更小
if(i!=k)//不在未排序第一的位置
swap(a[k],a[i]);
for(int t=0;t<len;t++)
cout<<a[t]<<" ";
cout<<endl;
}
}
int main()
{
int a[9]={
2,5,8,3,6,9,1,4,7};
int len=9;
SelectSort(a,len);
return 0;
}
特性
1.时间复杂度
O ( n 2 ) O(n^2) O(n2)
2.空间复杂度
平均的空间复杂度为: O ( 1 ) O(1) O(1)
3.算法稳定性
相同元素的前后顺序是否改变
举个很简单的例子
上图中,蓝色1会与蓝色2交换,直接改变两个2的前后位置
所以简单选择排序排序是不稳定的
小测验
好久不见小测验
老规矩,现在是把最小数交换到前面,改一个最大数交换到后面
冲冲冲ψ(`∇´)ψ