选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
选择排序就是从当前未排序的整数中找一个最小的整数,将它放在已排序的整数列表的最后。
如何找出最小的一个元素呢? 先随便选一个元素假设它为最小的元素(默认为序列的第一个元素),然后让这个元素与序列中的每一个元素进行比较,如果遇到比自己小的元素,那更新最小值下标,直到把序列中的元素遍历完,那最后的最小值就是序列中的最小值。
例如: 使用选择排序算法将数组 { 4,2,8,0,5,7,1,3,6,9 } 进行升序排序。
步骤:1. 在一个长度为n的无序数组中,第一次遍历n-1个数找到最小的和第一个数交换。
2. 第二次从下一个数开始遍历n-2个数,找到最小的数和第二个数交换。
3. 重复以上操作直到第n-1次遍历最小的数和第n-1个数交换,排序完成。
实现代码如下所示。
#include<iostream>
using namespace std;
void SelectSort(int *list, const int n)
{
for (int i = 0; i < n - 1; i++)
{
int min = i; //min为最小值索引
for (int j = i + 1; j < n; j++)
{
if (list[j] < list[min])
{
min = j;
}
}
std::swap(list[i], list[min]);
}
}
int main()
{
int a[] = { 4,2,8,0,5,7,1,3,6,9 };
cout << "排序前:" << endl;
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
cout << endl;
SelectSort(a, 10);
cout << "排序后:" << endl;
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
排序前:
4 2 8 0 5 7 1 3 6 9
排序后:
0 1 2 3 4 5 6 7 8 9
选择排序算法的详细过程如下图所示。
时间复杂度: 对于长度为
n
n
n的数组,代码执行的时间都花费在内层for循环中的比较语句和外层for循环里的交换语句了。外层for循环执行
n
−
1
n-1
n−1次,那么交换(swap)就执行
n
−
1
n-1
n−1次,时间复杂度为
O
(
n
)
O(n)
O(n);内层for循环中的比较语句执行次数为
(
n
−
1
)
+
(
n
−
2
)
+
…
+
2
+
1
=
n
(
n
−
1
)
2
=
1
2
n
2
−
1
2
n
(n-1) + (n-2) +…+2+1=\frac{n(n-1)}{2}=\frac{1}{2}n^{2}-\frac{1}{2}n
(n−1)+(n−2)+…+2+1=2n(n−1)=21n2−21n,时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。所以,选择排序算法的时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
空间复杂度: O ( 1 ) O(1) O(1)。
稳定性: 由于选择元素之后会发生交换操作,有可能把前面的元素交换到后面,所以选择排序不是稳定的排序,如下图所示。