选择排序简介
选择排序(Selection Sort)是一种直观且基础的排序算法。它的核心逻辑很简单:每一轮从未排序部分选出最小(或最大)元素,放到已排序序列的末尾。
对于排序算法的实现,通常遵循由局部到整体的思路:先排好一趟或一个元素,再排列多趟或全部元素。
工作原理
以升序排序为例,基本流程如下:
- 初始化:假设数组前部分是已排序的,后部分是未排序的。
- 寻找极值:遍历未排序部分,找出其中的最小值。
- 交换位置:将找到的最小值与当前未排序部分的第一个元素交换。
- 重复:缩小未排序部分的范围,重复上述步骤,直到整个数组有序。

我们以数组 [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48] 为例,手动推演一下过程:
- 第一轮:未排序部分为整个数组,最小值为
2。将2与首元素3交换。- 结果:
[2, 44, 38, 5, 47, 15, 36, 26, 27, 3, 46, 4, 19, 50, 48]
- 结果:
- 第二轮:未排序部分从索引 1 开始,最小值为
3。将3与44交换。- 结果:
[2, 3, 38, 5, 47, 15, 36, 26, 27, 44, 46, 4, 19, 50, 48]
- 结果:
- 第三轮:未排序部分从索引 2 开始,最小值为
4。将4与38交换。- 结果:
[2, 3, 4, 5, 47, 15, 36, 26, 27, 44, 46, 38, 19, 50, 48]
- 结果:
- 第四轮:未排序部分从索引 3 开始,最小值为
5(已在正确位置)。无需交换。- 结果不变。
- 第五轮:未排序部分从索引 4 开始,最小值为
15。与47交换。- 结果:
[2, 3, 4, 5, 15, 47, 36, 26, 27, 44, 46, 38, 19, 50, 48]
- 结果:
后续轮次依此类推,直到只剩最后一个元素时,排序完成。最终结果为:[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]。
代码实现
下面是基于 C 语言的基础实现。注意这里假设已有 Swap 函数用于交换两个整数的地址。
void SelectSort(int* a, int n) {
// i 控制逻辑:需要 n-1 趟排序才能使得待排数组有序
( i = ; i < n; i++) {
min_index = i;
( j = i + ; j < n; j++) {
(a[j] < a[min_index]) {
min_index = j;
}
}
Swap(&a[i], &a[min_index]);
}
}




