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

基于cat属性实现对象数组交替排序的高效方案与复杂度分析

问题解答

1. 原算法时间复杂度

  • 最坏时间复杂度为 O(n²):外层遍历数组每个元素的开销是O(n),当遇到连续相同cat属性的元素时,需要向后递归查找不同分类的元素,最坏情况(如数组前半段全为a、后半段全为b)每次查找需要遍历O(n)个元素,整体复杂度叠加为O(n²)。
  • 最坏空间复杂度为 O(n):递归查找的调用栈最坏深度可达O(n)。

2. 场景最优时间复杂度

该场景的最优时间复杂度为 O(n),仅需遍历数组2次即可完成排序,性能远优于原实现。

最简实现示例(O(n)时间 + O(n)空间)

思路是先拆分两类元素,再按规则交替拼接:

const alternateSort = (arr) => {
  // 一次遍历拆分两类元素
  const as = arr.filter(item => item.cat === 'a')
  const bs = arr.filter(item => item.cat === 'b')
  const res = []
  const minLen = Math.min(as.length, bs.length)
  // 交替拼接
  for(let i = 0; i < minLen; i++){
    res.push(as[i], bs[i])
  }
  // 追加剩余元素
  return res.concat(as.slice(minLen), bs.slice(minLen))
}

// 测试
const myArr = [
  {cat: 'a'}, {cat: 'b'},
  {cat: 'b'}, {cat: 'a'},
  {cat: 'b'}, {cat: 'b'},
  {cat: 'b'}, {cat: 'b'},
  {cat: 'b'}, {cat: 'a'}
]
console.log(alternateSort(myArr)) // 完全匹配预期输出

如果要求原地修改不额外占用空间,也可以用双指针法实现O(n)时间 + O(1)空间的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:45:03