
本文详解 selection sort 在 javascript 中常见实现错误——仅记录最小值却未正确交换位置,导致数组被错误覆盖为重复值;提供标准、可运行的修复版本及关键原理说明。
本文详解 selection sort 在 javascript 中常见实现错误——仅记录最小值却未正确交换位置,导致数组被错误覆盖为重复值;提供标准、可运行的修复版本及关键原理说明。
Selection Sort(选择排序)的核心思想是:每一轮遍历未排序部分,找到其中最小(或最大)元素的索引,然后将其与当前轮起始位置的元素交换。原代码的问题在于:内层循环只保存了最小值 cur = a[j],却丢失了该最小值在原数组中的位置信息;后续交换时又错误地用 cur(值)直接覆盖 a[i],同时未将原 a[i] 的值写回 minIndex 对应位置,最终造成多个位置被赋值为同一最小值(如 [1,1,1])。
正确的实现必须维护最小元素的索引(而非仅其值),并在外层循环末尾执行标准三步交换:
function selectionSort(a) {
for (let i = 0; i < a.length - 1; i++) {
let minIndex = i; // 初始化最小值索引为当前起始位置
// 在未排序子数组 [i...end] 中查找最小值的索引
for (let j = i + 1; j < a.length; j++) {
if (a[j] < a[minIndex]) {
minIndex = j; // 更新最小值索引
}
}
// 仅当最小值不在当前位置时才交换,避免自交换
if (minIndex !== i) {
const temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
return a;
}
// 测试验证
console.log(selectionSort([3, 2, 1])); // [1, 2, 3]
console.log(selectionSort([4, 5, 1, 2, 7])); // [1, 2, 4, 5, 7]⚠️ 关键注意事项:
- 勿混淆“值”与“索引”:cur = a[j] 只存值,无法定位原位置;必须用 minIndex 记录下标才能精准交换;
- 交换逻辑必须双向:先暂存 a[i],再将 a[minIndex] 赋给 a[i],最后把暂存值赋给 a[minIndex];
- 边界控制:外层循环只需到 a.length - 1,因最后一个元素自然有序;
- 稳定性无关:Selection Sort 是不稳定排序,但本实现确保功能正确性优先。
该算法时间复杂度恒为 O(n²),空间复杂度 O(1),适合教学理解或小规模数据场景。掌握索引驱动的交换逻辑,是避免此类“值覆盖陷阱”的根本。
立即学习“Java免费学习笔记(深入)”;


















