生成 JavaScript 数组的排列[重复]

2023-11-27

我在 javascript 中有一个由 n 个不同元素组成的数组,我知道有 n 个!对这些元素进行排序的可能方法。我想知道生成该数组的所有可能顺序的最有效(最快)算法是什么?

我有这个代码:

var swap = function(array, frstElm, scndElm) {

    var temp = array[frstElm];
    array[frstElm] = array[scndElm];
    array[scndElm] = temp;
}

var permutation = function(array, leftIndex, size) {

    var x;

    if(leftIndex === size) {

        temp = "";

        for (var i = 0; i < array.length; i++) {
            temp += array[i] + " ";
        }

        console.log("---------------> " + temp);

    } else {

        for(x = leftIndex; x < size; x++) {
            swap(array, leftIndex, x);
            permutation(array, leftIndex + 1, size);
            swap(array, leftIndex, x);
        }
    }
}

arrCities = ["Sidney", "Melbourne", "Queenstown"];
permutation(arrCities, 0, arrCities.length);

它有效,但我想交换每个项目来获得组合在内存方面有点昂贵,我认为这样做的一个好方法就是专注于数组的索引并获取数字的所有排列,我是想知道是否有一种方法可以计算所有这些,而无需切换数组中的元素?我想递归地可以得到所有这些,我需要帮助才能做到这一点。

例如,如果我有:

arrCities = ["Sidney", "Melbourne", "Queenstown"];

我希望输出是:

[[012],[021],[102],[120],[201],[210]]

or:

[[0,1,2],
 [0,2,1],
 [1,0,2],
 [1,2,0],
 [2,0,1],
 [2,1,0]]

我正在读这个:http://en.wikipedia.org/wiki/Permutation#Algorithms_to_generate_permutations

但维基百科从来不擅长解释。我不太明白其中的内容,我不得不说我的数学水平不是最好的。


这个功能,perm(xs),返回给定数组的所有排列:

function perm(xs) {
  let ret = [];

  for (let i = 0; i < xs.length; i = i + 1) {
    let rest = perm(xs.slice(0, i).concat(xs.slice(i + 1)));

    if(!rest.length) {
      ret.push([xs[i]])
    } else {
      for(let j = 0; j < rest.length; j = j + 1) {
        ret.push([xs[i]].concat(rest[j]))
      }
    }
  }
  return ret;
}

console.log(perm([1,2,3]).join("\n"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成 JavaScript 数组的排列[重复] 的相关文章