当前位置:首页 > JavaScript

js实现排列

2026-03-13 18:57:30JavaScript

排列的概念

排列是指从一组元素中按照一定顺序选取若干个元素的所有可能组合。例如,从 [1, 2, 3] 中选取 2 个元素的排列为 [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]。

递归实现排列

递归是一种常见的排列生成方法,通过逐步固定前缀并递归处理剩余元素实现。

function permute(arr) {
  const result = [];
  const backtrack = (current, remaining) => {
    if (remaining.length === 0) {
      result.push([...current]);
      return;
    }
    for (let i = 0; i < remaining.length; i++) {
      current.push(remaining[i]);
      const newRemaining = remaining.slice(0, i).concat(remaining.slice(i + 1));
      backtrack(current, newRemaining);
      current.pop();
    }
  };
  backtrack([], arr);
  return result;
}

堆算法(非递归实现)

堆算法通过交换元素位置生成排列,适合内存敏感的场景。

function heapPermute(arr) {
  const result = [];
  const generate = (n, arr) => {
    if (n === 1) {
      result.push([...arr]);
      return;
    }
    for (let i = 0; i < n; i++) {
      generate(n - 1, arr);
      if (n % 2 === 0) {
        [arr[i], arr[n - 1]] = [arr[n - 1], arr[i]];
      } else {
        [arr[0], arr[n - 1]] = [arr[n - 1], arr[0]];
      }
    }
  };
  generate(arr.length, arr);
  return result;
}

使用生成器实现排列

生成器可以按需生成排列,避免一次性占用过多内存。

function* permuteGenerator(arr) {
  if (arr.length <= 1) yield arr;
  else {
    const [first, ...rest] = arr;
    for (const perm of permuteGenerator(rest)) {
      for (let i = 0; i <= perm.length; i++) {
        yield [...perm.slice(0, i), first, ...perm.slice(i)];
      }
    }
  }
}

处理重复元素的排列

当输入数组包含重复元素时,需跳过重复排列。

js实现排列

function permuteUnique(arr) {
  const result = [];
  arr.sort((a, b) => a - b);
  const backtrack = (current, remaining) => {
    if (remaining.length === 0) {
      result.push([...current]);
      return;
    }
    for (let i = 0; i < remaining.length; i++) {
      if (i > 0 && remaining[i] === remaining[i - 1]) continue;
      current.push(remaining[i]);
      const newRemaining = remaining.slice(0, i).concat(remaining.slice(i + 1));
      backtrack(current, newRemaining);
      current.pop();
    }
  };
  backtrack([], arr);
  return result;
}

性能优化建议

对于大规模数据,考虑使用迭代替代递归,或采用惰性求值(如生成器)。实际应用中可根据具体需求选择递归、堆算法或库函数实现。

标签: 排列js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…