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

JavaScript如何实现数组从最外层到最内层交替排序

方案1:单行生成式实现(时间复杂度O(n),优先推荐)

该方案直接通过索引映射生成目标数组,比Array.sort的O(nlogn)效率更高,代码更简洁:

// 直接调用即可生成排序后数组,不会修改原数组
const specialSort = arr => Array.from({length: arr.length}, (_, i) => 
  i % 2 === 0 ? arr[i / 2] : arr[arr.length - (i + 1) / 2]
);

// 测试用例
console.log(specialSort([1,2,3,4,5])); // [1,5,2,4,3]
console.log(specialSort([1,2,3,4])); // [1,4,2,3]

方案2:Array.sort 实现(符合要求的排序函数写法)

如果必须使用Array.sort方法,可以用以下实现,兼容数组存在重复元素的场景:

const specialSortBySort = arr => arr
  .map((val, idx) => ({val, idx}))
  .sort((a, b) => {
    const len = arr.length;
    const mid = Math.floor((len - 1) / 2);
    const getSortWeight = idx => idx <= mid ? idx * 2 : 2 * (len - idx) - 1;
    return getSortWeight(a.idx) - getSortWeight(b.idx);
  })
  .map(item => item.val);

// 测试用例
console.log(specialSortBySort([1,2,3,4,5])); // [1,5,2,4,3]
console.log(specialSortBySort([1,2,3,4])); // [1,4,2,3]

如果数组元素全是唯一值,可以简化为闭包的排序函数写法:

const getSortFn = arr => (a, b) => {
  const len = arr.length, mid = Math.floor((len - 1) / 2);
  const getWeight = idx => idx <= mid ? idx * 2 : 2*(len - idx) -1;
  return getWeight(arr.indexOf(a)) - getWeight(arr.indexOf(b));
};

// 使用
const sorted = [1,2,3,4,5].sort(getSortFn([1,2,3,4,5]));
console.log(sorted); // [1,5,2,4,3]

内容的提问来源于stack exchange,提问作者SeriousLee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:03