在学习排序算法时,选择排序(Selection Sort)是一个非常经典的入门算法。它的核心思想是:每一轮从未排序的部分中选择最小值,放到已排序序列的末尾。虽然效率不高,但它简单直观,非常适合打基础。
一、选择排序的基本思想
给定一个数组:
5, 3, 2, 7, 6, 10, 8, 9, 1, 4
排序过程如下:
- 第一轮:在整个数组中找到最小值
1,与第一个元素5交换 →
1, 3, 2, 7, 6, 10, 8, 9, 5, 4 - 第二轮:在下标
1~9中找到最小值2,与3交换 →
1, 2, 3, 7, 6, 10, 8, 9, 5, 4 - 第三轮:在下标
2~9中找到最小值3,发现已经在正确位置 →
1, 2, 3, 7, 6, 10, 8, 9, 5, 4 - 第四轮:在下标
3~9中找到最小值4,与7交换 →
1, 2, 3, 4, 6, 10, 8, 9, 5, 7
……依次类推,直到最后一个元素。
二、代码实现
下面给出 C 语言的实现代码:
#include <stdio.h>
int main() {
int arr[10] = {5, 3, 2, 7, 6, 10, 8, 9, 1, 4};
int i, j, minIndex;
// 外层循环控制轮数
for (i = 0; i < 9; i++) {
minIndex = i; // 假设当前元素是最小值
// 内层循环找出未排序部分的最小值
for (j = i + 1; j < 10; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 如果找到了比当前元素更小的值,交换
if (minIndex != i) {
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
// 输出排序结果
printf("排序结果:\n");
for (i = 0; i < 10; i++) {
printf("%d\t", arr[i]);
}
return 0;
}
三、运行结果
执行程序后输出为:
1 2 3 4 5 6 7 8 9 10
四、时间复杂度与空间复杂度
-
时间复杂度:
- 外层循环执行
n-1次,内层循环逐渐减少,总比较次数接近n*(n-1)/2 - 复杂度为
O(n^2)
- 外层循环执行
-
空间复杂度:
- 只用到常数级别的额外变量
minIndex、temp - 空间复杂度为
O(1)
- 只用到常数级别的额外变量
五、特点与适用场景
✅ 优点:
- 实现简单,思路直观
- 不需要额外空间
❌ 缺点:
- 效率低,适合小规模数据
- 不稳定(相同元素可能交换顺序)
📌 适用场景:
- 学习排序入门
- 数据量很小,对性能要求不高
六、总结
选择排序就是“每轮找最小,放前面”。虽然在实际工程中应用不多(通常会用更高效的排序算法,如快速排序、归并排序),但作为基础算法,它能帮助我们更好地理解排序的本质和循环嵌套的逻辑。