文章目录
算法原理
选择排序是一种基于比较的简单排序算法,其核心思想是:
1、每次从未排序部分选择最小(或最大)元素。
2、将其放到已排序部分的末尾。
3、重复上述过程,直到所有元素有序。
代码实现
bash
#include <stdio.h>
// 选择排序函数
void selectionSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) { // 外层循环控制已排序部分的末尾
int min_idx = i; // 假设当前位置为最小值索引
// 内层循环寻找未排序部分的最小值
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j; // 更新最小值索引
}
}
// 将最小值交换到已排序部分的末尾
if (min_idx != i) { // 避免不必要的交换
int temp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = temp;
}
}
}
// 测试代码
int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
selectionSort(arr, n);
printf("排序结果: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
执行过程示例
以数组 [5, 2, 9, 1, 5] 为例:
bash
初始数组: [5, 2, 9, 1, 5]
第1轮:
- 找到最小值 1(索引 3),交换到位置 0 → [1, 2, 9, 5, 5]
第2轮:
- 剩余部分 [2, 9, 5, 5],最小值 2(索引 1),无需交换 → [1, 2, 9, 5, 5]
第3轮:
- 剩余部分 [9, 5, 5],最小值 5(索引 3),交换到位置 2 → [1, 2, 5, 9, 5]
第4轮:
- 剩余部分 [9, 5],最小值 5(索引 4),交换到位置 3 → [1, 2, 5, 5, 9]
特点
原地排序:仅需常数级额外空间(O(1))。
不稳定排序:相同元素的相对位置可能改变(如 [5, 5, 2] 中第一个 5 会被交换到后面)。
时间复杂度:始终为 O(n²)(无论输入是否有序)。
优缺点对比
| 优点 | 缺点 |
|---|---|
| 实现简单,代码直观 | 时间复杂度始终为 O(n²) |
| 交换次数少(最多 n-1 次) | 不适合大规模数据排序 |
| 空间复杂度低(O(1)) | 不稳定排序(可能改变相同元素顺序) |
适用场景
1、小规模数据排序(如 n < 1000)。
2、内存受限环境(如嵌入式系统)。
3、教学示例(理解排序算法的基本思想)。