选择排序(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)。
稳定性: 由于选择元素之后会发生交换操作,有可能把前面的元素交换到后面,所以选择排序不是稳定的排序,如下图所示。