You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求通用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:35:44