1.步骤及演示
- 对待排序序列L[1…n]进行n-1遍循环处理
- 第i次循环,找出L[i+1…n]中最小/最大的数据与L[i]交换
2.代码实现及优化
以从小到大排序为例:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i, j, n, a[10000], temp, k;
cin>>n;
for (i = 1; i <= n; i++)cin>>a[i];
for (i = 1; i <= n - 1; i++){
k = i;
for (j = i + 1; j <= n; j++)
if (a[j] < a[k]) k = j;
if (k != i){
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
for (i = 1; i <= n; i++)
cout << a[i] << ' ';
return 0;
}
关于选择排序的优化,可以在每一轮循环时同时寻找最大值与最小值,进行两次交换。
3.时空复杂度与稳定性
1.时空复杂度
复杂度种类 | 复杂度 |
---|---|
最差时间复杂度 | O(n^2) |
最优时间复杂度 | O(n^2) |
平均时间复杂度 | O(n^2) |
空间复杂度 | O(1) |
选择排序在实现时使用了二层for循环嵌套,且无论给定序列是否有序都要经过二层遍历,所以最好最坏平均时间复杂度均为O(n^2),空间上只需要一个或两个标记变量,对数据规模无依赖。
2.稳定性:
选择排序是不稳定的(即数据相对位置可能发生变化)