前言
选择排序(Selection Sort)是基础排序算法之一。它的核心逻辑非常直观:在每一轮遍历中,从未排序的元素里选出最小(或最大)值,将其放置到已排序序列的末端。
实现思路遵循由局部到整体:先排好一个元素,再逐步扩展到整个数组。
一、工作原理
以升序排序为例,整个过程可以理解为将数组划分为'已排序'和'未排序'两个区域。初始时,已排序区域为空。
- 初始化:假设当前数组前部已有序,后部无序。
- 寻找极值:遍历未排序部分,找出最小值(或最大值)的下标。
- 交换位置:将找到的极值与未排序部分的第一个元素交换。
- 重复:缩小未排序范围,重复上述步骤,直到整个数组有序。

执行过程示例
假设待排序数组为 [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]。
- 第一轮:在未排序部分找到最小值
2,与首位3交换。数组变为[2, 44, 38, 5, ...]。 - 第二轮:剩余未排序部分找到最小值
3,与当前首位44交换。数组变为[2, 3, 38, 5, ...]。 - 第三轮:继续寻找最小值
4,与38交换。
以此类推,每轮确定一个元素的最终位置。当只剩最后一个元素时,排序自然完成。
二、代码实现
下面是 C 语言的标准实现。注意 Swap 函数通常用于交换两个整数的值。
void SelectSort(int* a, int n) {
// i 控制排序趟数,n 个元素需要 n-1 趟
for (int i = 0; i < n - 1; i++) {
// 默认当前趟的最小值下标为未排序部分的第一个元素
int min_index = i;
// j 从 i+1 开始遍历,寻找真正的最小值下标
for (int j = i + 1; j < n; j++) {
if (a[j] < a[min_index]) {
min_index = j;
}
}
// 如果找到了更小的值,则交换
(min_index != i) {
Swap(&a[i], &a[min_index]);
}
}
}



