算法-选择排序
前置知识
- C++入门
思路
我们现在有一个序列,怎么对它排序?
这是一个非常经典的问题,这里我们使用一个经典的基础算法——选择排序解决。
这里有一个序列,要对它升序排序
6
1
8
4
9
7
2
5
3
\begin{array}{cc} 6&1&8&4&9&7&2&5&3 \end{array}
618497253
我们把序列分为无序序列和有序序列。
这里,我们将无序序列用红色表示,有序序列用蓝色表示
很显然,这里的所以元素默认都是无序的,换句话说,所有元素都属于无序序列
6
1
8
4
9
7
2
5
3
\begin{array}{cc} \red6&\red1&\red8&\red4&\red9&\red7&\red2&\red5&\red3 \end{array}
618497253
此时从无序序列中选取最小的值,将其与无序序列第一个数交换,并入有序序列
min
=
1
1
6
8
4
9
7
2
5
3
\min=1\\\begin{array}{cc} \blue1&\red6&\red8&\red4&\red9&\red7&\red2&\red5&\red3 \end{array}
min=1168497253
重复操作,直至无序序列为空。
min
=
2
1
2
8
4
9
7
6
5
3
min
=
3
1
2
3
4
9
7
6
5
8
min
=
4
1
2
3
4
9
7
6
5
8
min
=
5
1
2
3
4
5
7
6
9
8
min
=
6
1
2
3
4
5
6
7
9
8
min
=
7
1
2
3
4
5
6
7
9
8
min
=
8
1
2
3
4
5
6
7
8
9
min
=
9
1
2
3
4
5
6
7
8
9
\min=2\\\begin{array}{cc} \blue1&\blue2&\red8&\red4&\red9&\red7&\red6&\red5&\red3 \end{array}\\\min=3\\\begin{array}{cc} \blue1&\blue2&\blue3&\red4&\red9&\red7&\red6&\red5&\red8 \end{array}\\\min=4\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\red9&\red7&\red6&\red5&\red8 \end{array}\\\min=5\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\red7&\red6&\red9&\red8 \end{array}\\\min=6\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\red7&\red9&\red8 \end{array}\\\min=7\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\blue7&\red9&\red8 \end{array}\\\min=8\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\blue7&\blue8&\red9 \end{array}\\\min=9\\\begin{array}{cc} \blue1&\blue2&\blue3&\blue4&\blue5&\blue6&\blue7&\blue8&\blue9 \end{array}
min=2128497653min=3123497658min=4123497658min=5123457698min=6123456798min=7123456798min=8123456789min=9123456789
算法参数
- 时间复杂度: Θ ( n 2 ) \Theta(n^2) Θ(n2)
- 空间复杂度: Θ ( n ) \Theta(n) Θ(n)
- 稳定性:不稳定
实现代码
void SelectionSort(int a[],int n){
for (int i=1;i<=n;i++){
int pos=i;
for (int j=i+1;j<=n;j++)
if (a[pos]>a[j])
pos=j;
swap(a[i],a[pos]);
}
}
练习
- 洛谷 【模板】排序的 20 p t s 20pts 20pts