选择排序的核心逻辑是每轮在未排序部分找最小值并交换到当前待填位置;需先遍历确定最小值索引,再交换,共n-1轮,用两层for实现,外层定位置、内层找最小值。

选择排序的核心逻辑是什么
选择排序不是靠交换相邻元素,而是每轮找未排序部分的最小(或最大)值,把它放到当前待填位置。C++里不依赖额外库也能写,关键在理解“找最小值索引”和“交换”两个动作的顺序。
- 错误做法:边遍历边交换,会打乱未排序区,导致结果错乱
- 正确做法:先完整扫描未排序段,记下最小值下标,再执行一次交换
- 数组长度为
n时,只需循环n-1轮——最后一轮只剩一个数,自然有序
用 for 循环实现 int 数组的选择排序
最常用、最易调试的方式是手写两层 for:外层定位置,内层找最小值。注意边界和索引更新。
void selectionSort(int arr[], int n) {
for (int i = 0; i
-
minIdx初始化为i,不是0,否则会反复比较已排好的前段 - 内层
j从i + 1开始,避免自己跟自己比 - 交换前加
if (minIdx != i)判断,避免原地交换(虽不影响结果,但减少无谓操作)
vector 怎么用同样逻辑排序
把数组换成 std::vector 后,接口没变,但要注意 size() 返回 size_t,和 int 混用可能触发隐式转换警告或负值问题。
- 推荐统一用
int类型索引变量,显式转换:int n = static_cast<int>(vec.size());</int> - 也可以用基于范围的
for配合迭代器,但选择排序本质依赖下标,强行用范围循环反而绕弯 - 若用
std::swap,需包含<utility></utility>;C++11 起也可直接用赋值交换,但std::swap更语义清晰
为什么 sort() 不叫选择排序,还更快
std::sort 默认是混合算法(introsort),底层结合了快排、堆排和插入排序,平均复杂度 O(n log n),而手写选择排序固定 O(n²)。它不暴露内部策略,也不允许你指定“用选择排序”。
- 想强制用选择排序?只能自己写,
std::sort不提供算法选择开关 - 小数组(
n )时,选择排序常数小,未必比 <code>std::sort慢太多;但一过百,差距就明显了 - 稳定性:选择排序不稳定——相同值的相对位置可能改变,这点和
std::sort一样(标准不保证稳定)
真正要稳定又可控,得用 std::stable_sort,但它也不是选择排序,底层通常是归并。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











