选择排序(Selection Sort)是一种简单直观的排序算法,核心思想是:每一趟从待排序序列中选取关键字最小(或最大)的元素,放入已排序序列的末尾。
void SelectSort(int A[], int n) {
int i, j, min;
for (i = 0; i < n - 1; i++) { // 共 n-1 趟
min = i; // 记录最小元素下标
for (j = i + 1; j < n; j++) // 在未排序中找最小
if (A[j] < A[min]) min = j;
if (min != i) { // 交换
int temp = A[i]; A[i] = A[min]; A[min] = temp;
}
}
}
对序列 {49, 38, 65, 97, 76, 13, 27, 49*} 进行选择排序:
| 趟次 | 选中最小(位置) | 交换后序列 |
|---|---|---|
| 1 | 13(5) | [13] 38 65 97 76 49 27 49* |
| 2 | 27(6) | [13 27] 65 97 76 49 38 49* |
| 3 | 38(6) | [13 27 38] 97 76 49 65 49* |
| 4 | 49(5) | [13 27 38 49] 76 97 65 49* |
| 5 | 49*(7) | [13 27 38 49 49*] 97 65 76 |
| 6 | 65(6) | [13 27 38 49 49* 65] 97 76 |
| 7 | 76(7) | [13 27 38 49 49* 65 76 97] |
| 情况 | 时间复杂度 | 说明 |
|---|---|---|
| 最好 | $O(n^2)$ | 序列有序 |
| 平均 | $O(n^2)$ | 随机输入 |
| 最坏 | $O(n^2)$ | 序列逆序 |
| 空间 | $O(1)$ | 原地排序 |
{5, 8, 5*, 2}:第 1 趟选最小 2 与位置 0 交换 → {2, 8, 5*, 5},5 与 5* 相对顺序改变。(暂无关联知识点)