当前位置:首页 > JavaScript

js数组实现全排列

2026-03-01 19:50:32JavaScript

全排列的概念

全排列是指从给定数组中取出所有元素进行排列组合,生成所有可能的顺序。对于长度为n的数组,全排列共有n!种可能。

递归实现方法

递归是解决全排列问题的经典方法。通过固定一个元素,递归生成剩余元素的全排列,再将固定的元素与递归结果拼接。

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

  function 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([], nums);
  return result;
}

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

交换法实现

通过交换数组元素的位置来生成排列,减少内存消耗。

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

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

  function generate(start) {
    if (start === nums.length - 1) {
      result.push([...nums]);
      return;
    }

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

  generate(0);
  return result;
}

使用堆算法

堆算法是一种非递归的全排列生成方法,效率较高。

function heapPermute(nums) {
  const result = [];
  const n = nums.length;
  const c = new Array(n).fill(0);

  result.push([...nums]);

  let i = 0;
  while (i < n) {
    if (c[i] < i) {
      if (i % 2 === 0) {
        [nums[0], nums[i]] = [nums[i], nums[0]];
      } else {
        [nums[c[i]], nums[i]] = [nums[i], nums[c[i]]];
      }
      result.push([...nums]);
      c[i]++;
      i = 0;
    } else {
      c[i] = 0;
      i++;
    }
  }

  return result;
}

使用库函数

现代JavaScript引擎提供了更简洁的实现方式。

// 使用生成器函数
function* permuteGenerator(arr) {
  if (arr.length === 1) yield arr;

  for (let i = 0; i < arr.length; i++) {
    const rest = [...arr.slice(0, i), ...arr.slice(i + 1)];
    for (const p of permuteGenerator(rest)) {
      yield [arr[i], ...p];
    }
  }
}

// 转换为数组
const permutations = [...permuteGenerator([1, 2, 3])];
console.log(permutations);

性能考虑

对于大型数组,递归方法可能会导致堆栈溢出。非递归方法如堆算法更适合处理大量数据。在实际应用中,应根据数据规模选择合适的方法。

去重处理

当数组包含重复元素时,需要额外处理以避免生成重复排列。

js数组实现全排列

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

  function 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([], nums);
  return result;
}

标签: 数组排列
分享给朋友:

相关文章

vue实现数组

vue实现数组

vue实现数组操作 在Vue中操作数组需要使用Vue提供的响应式方法,直接修改数组元素不会触发视图更新。以下是常见的数组操作方法: 添加元素 使用push、unshift或splice方法添加元素:…

vue数组实现乘法

vue数组实现乘法

在 Vue 中实现数组乘法 Vue 中可以通过计算属性或方法实现数组乘法操作。以下是几种常见的方法: 使用计算属性计算数组乘积 计算属性适合在依赖的数组发生变化时自动更新结果。 data(…

vue怎么实现数组遍历

vue怎么实现数组遍历

数组遍历的基本方法 在Vue中遍历数组可以使用v-for指令,这是Vue提供的用于渲染列表数据的核心指令。基本语法如下: <ul> <li v-for="item in ite…

原生加数组实现vue

原生加数组实现vue

使用原生 JavaScript 和数组实现 Vue 的核心功能 Vue 的核心功能包括数据响应式、模板渲染和指令绑定。通过原生 JavaScript 和数组可以模拟部分功能,以下是一个简化版的实现方式…

js中数组怎么实现

js中数组怎么实现

数组的创建 在JavaScript中,数组可以通过多种方式创建。最直接的方法是使用数组字面量: const arr1 = [1, 2, 3]; // 包含三个数字的数组 const arr2 = […

js数组升序排序实现

js数组升序排序实现

使用 sort() 方法实现升序排序 JavaScript 数组的 sort() 方法默认按 Unicode 码点排序,对数字数组需传入比较函数。比较函数返回 a - b 时实现升序排列: cons…