手动实现JavaScript数组降序排序问题求助
问题分析与修复方案
原代码的核心问题
- 遍历方式错误:使用
for...in遍历数组时,循环变量num是数组的索引字符串,不是数组元素值。比如遍历[0,10,-1,4,7]时,num依次是"0"、"1"、"2"等,你拿字符串索引和数值比较,逻辑完全偏离预期。 - 排序逻辑缺失:你的代码只是在每次循环里比较当前索引和初始值,然后重复push同一个值,完全没有实现“从大到小排序”的核心逻辑——没有找出数组中的最大值,也没有处理剩余未排序的元素。
修复后的实现(选择排序)
选择排序是适合手动实现的排序算法,思路是每次从剩余未排序的元素中找到最大值,放到已排序部分的末尾:
const sortArray = (array) => { // 复制原数组,避免修改输入的原始数组 const arr = [...array]; const length = arr.length; for (let i = 0; i < length - 1; i++) { // 假设当前索引是最大值的位置 let maxIndex = i; // 遍历剩余未排序元素,找到真正的最大值索引 for (let j = i + 1; j < length; j++) { if (arr[j] > arr[maxIndex]) { maxIndex = j; } } // 交换当前位置和最大值位置的元素 [arr[i], arr[maxIndex]] = [arr[maxIndex], arr[i]]; } return arr; }; console.log(sortArray([0,10,-1,4,7])); // 输出: [10, 7, 4, 0, -1]
代码说明
- 先复制原数组,避免修改输入的原始数组(如果不需要保留原数组,也可以直接操作原数组)。
- 外层循环控制已排序部分的边界,内层循环在未排序部分中找到最大值的索引。
- 通过解构赋值交换当前位置和最大值位置的元素,完成一次排序步骤。
- 最终返回从大到小排序后的数组。
内容的提问来源于stack exchange,提问作者Symply Chima
相关产品推荐
相关产品推荐

