寻求通用JavaScript数组交替排序实现:最大值最小值依次排列
数组交替排序实现方案(最大-最小交替)
需求描述
实现数组的交替排序:首个元素为数组最大值,接着是最小值,之后依次取剩余元素的最大值、最小值,以此类推。示例:输入[1,2,3,4],输出[4,1,3,2]。
原代码的局限性
你提供的代码仅能处理固定4个元素的数组,且存在以下问题:
- 处理含重复元素的数组(如
[1,0,0,1])时,结果不符合规则 - 数组为空或仅含单个元素时,会返回
Infinity/-Infinity,逻辑错误
通用实现方案
方案1:排序+双指针法(高效推荐)
先对数组进行升序排序,然后用双指针从数组两端向中间交替取值(先取右端最大值,再取左端最小值),直到所有元素取完。该方法时间复杂度为O(n log n)(主要来自排序),适合处理大数据量数组。
function alternateSort(arr) { // 复制原数组避免修改原数据,同时进行升序排序 const sortedArr = [...arr].sort((a, b) => a - b); const result = []; let left = 0; let right = sortedArr.length - 1; let isTakeMax = true; while (left <= right) { if (isTakeMax) { result.push(sortedArr[right]); right--; } else { result.push(sortedArr[left]); left++; } // 切换下一次取值类型 isTakeMax = !isTakeMax; } return result; }
测试验证
- 输入
[1,2,3,4]→ 输出[4,1,3,2](符合示例) - 输入
[1,0,0,1]→ 输出[1,0,1,0](正确处理重复元素) - 输入
[1,2,3,4,5]→ 输出[5,1,4,2,3](奇数长度数组正确保留中间元素) - 输入
[5]→ 输出[5](单元素数组正常返回) - 输入
[]→ 输出[](空数组正常返回)
方案2:迭代取最大最小值(直观易懂)
每次从剩余数组中取出最大值和最小值,加入结果集后移除对应元素,直到数组为空。该方法逻辑直观,但时间复杂度为O(n²),适合小数据量场景。
function alternateSort(arr) { const tempArr = [...arr]; const result = []; while (tempArr.length > 0) { // 取当前数组最大值并加入结果 const currentMax = Math.max(...tempArr); result.push(currentMax); tempArr.splice(tempArr.indexOf(currentMax), 1); // 若数组已空,终止循环 if (tempArr.length === 0) break; // 取当前数组最小值并加入结果 const currentMin = Math.min(...tempArr); result.push(currentMin); tempArr.splice(tempArr.indexOf(currentMin), 1); } return result; }
测试验证
该方案同样能通过上述所有测试案例,结果符合预期。
内容的提问来源于stack exchange,提问作者deftins12
相关产品推荐
相关产品推荐

