当前位置:首页 > JavaScript

js实现排列

2026-04-05 13:13:36JavaScript

排列算法实现(JavaScript)

排列是指从一组元素中按照一定顺序选取部分或全部元素进行排列组合。以下是几种常见的排列实现方法:

1. 全排列(递归法)

function permute(nums) {
  let result = [];

  const backtrack = (path, remaining) => {
    if (remaining.length === 0) {
      result.push([...path]);
      return;
    }

    for (let i = 0; i < remaining.length; i++) {
      path.push(remaining[i]);
      backtrack(
        path, 
        remaining.slice(0, i).concat(remaining.slice(i + 1))
      );
      path.pop();
    }
  };

  backtrack([], nums);
  return result;
}

// 示例
console.log(permute([1, 2, 3]));

2. 全排列(交换法)

function permuteSwap(nums) {
  const result = [];

  const swap = (arr, i, j) => {
    [arr[i], arr[j]] = [arr[j], arr[i]];
  };

  const generate = (start, arr) => {
    if (start === arr.length - 1) {
      result.push([...arr]);
      return;
    }

    for (let i = start; i < arr.length; i++) {
      swap(arr, start, i);
      generate(start + 1, arr);
      swap(arr, start, i);
    }
  };

  generate(0, nums);
  return result;
}

// 示例
console.log(permuteSwap([1, 2, 3]));

3. 部分排列(从n个元素中取k个)

function partialPermute(nums, k) {
  const result = [];

  const backtrack = (path, remaining) => {
    if (path.length === k) {
      result.push([...path]);
      return;
    }

    for (let i = 0; i < remaining.length; i++) {
      path.push(remaining[i]);
      backtrack(
        path,
        remaining.slice(0, i).concat(remaining.slice(i + 1))
      );
      path.pop();
    }
  };

  backtrack([], nums);
  return result;
}

// 示例
console.log(partialPermute([1, 2, 3, 4], 2));

4. 去重排列(含重复元素)

function permuteUnique(nums) {
  const result = [];
  nums.sort((a, b) => a - b);

  const backtrack = (path, used) => {
    if (path.length === nums.length) {
      result.push([...path]);
      return;
    }

    for (let i = 0; i < nums.length; i++) {
      if (used[i] || (i > 0 && nums[i] === nums[i - 1] && !used[i - 1])) {
        continue;
      }

      used[i] = true;
      path.push(nums[i]);
      backtrack(path, used);
      path.pop();
      used[i] = false;
    }
  };

  backtrack([], new Array(nums.length).fill(false));
  return result;
}

// 示例
console.log(permuteUnique([1, 1, 2]));

性能优化建议

1. 记忆化搜索 对于包含重复元素的排列问题,可以结合排序和记忆化技术来优化性能。

2. 迭代法替代递归 对于大规模数据,可以考虑使用堆算法(Heap's algorithm)的迭代实现来避免递归栈溢出。

3. 位运算优化 当元素数量较少(n ≤ 32)时,可以使用位掩码来表示元素的选择状态。

js实现排列

应用场景

  • 密码破解中的暴力尝试
  • 游戏中的关卡组合生成
  • 数据分析中的参数排列组合
  • 测试用例的自动化生成

以上实现涵盖了排列问题的常见场景,可根据具体需求选择合适的方法。递归法代码简洁但可能有栈深度限制,交换法则更节省空间但稍难理解。

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

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现全选

js实现全选

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

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…