C++选择排序原理
一、算法核心步骤
- 初始化:将整个数组分为 有序区(空)和 无序区(全部元素)
- 查找最小值:在无序区中找到最小值的索引
- 交换位置:将找到的最小元素和无序区的第一个元素交换
- 缩小范围:有序区扩大一个元素,无序区缩小一个元素
- 重复执行:重复步骤2-4直到无序区只剩一个元素
二、C++实现模版
#include <iostream>
using namespace std;
void selectionSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) { // 外层循环控制有序区的边界
int minIndex = i; // 假设当前无序区第一个元素是最小值
// 内层循环查找实际最小值
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) { // 发现更小元素时更新索引
minIndex = j;
}
}
// 将最小值交换到有序区末尾
swap(arr[i], arr[minIndex]);
}
}
int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
selectionSort(arr, n);
cout << "Sorted array: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
return 0;
}
代码关键点:
| 代码段 | 作用说明 |
|---|---|
for (int i = 0; i < n -1; i++) |
控制有序区的边界,每次循环后有序区增加一个元素 |
int minIndex = i |
初始化最小值为无序区第一个元素 |
j = i + 1 |
内层循环跳过已排序部分,仅扫描无序区 |
swap(arr[i], arr[minIndex]) |
将找到的最小元素与无序区首元素交换,完成一次排 |
三、算法分析
| 特性 | 说明 |
|---|---|
| 时间复杂度 | O(n²)(无论数据是否有序,都需要完整比较) |
| 空间复杂度 | O(1)(原地排序,不需要额外存储空间) |
| 稳定性 | 不稳定(相同元素的相对位置可能改变) |
| 最佳适用场景 | 小规模数据 / 需要减少交换次数的场景 |
四、可视化
初始状态:|64 25 12 22 11
第1轮: 11 |25 12 22 64
第2轮: 11 12 |25 22 64
第3轮: 11 12 22 |25 64
第4轮: 11 12 22 25 |64
五、优化方向
- 同时找最大最小值:每次遍历同时找最小和最大值,减少循环次数
- 递归实现:通过递归处理剩余无序区
- 适应性改进:检测是否已有序时提前终止循环

浙公网安备 33010602011771号