当前位置:首页 > 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. 全排列(交换法)

js实现排列

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. 去重排列(含重复元素)

js实现排列

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 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…