我有一个包含n个不同元素的 JavaScript 数组,我知道这些元素可以有 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]]
或者:[[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
但是维基百科从来没有很好地解释过。我不太理解其中的大部分内容,我必须承认我的数学水平不是很好。
[ [ 012 ], [ 021 ],…]
不太可能有用,因为这样的文字已被弃用。幸运的是,使用提供的排列函数和array.map((_, index) => index)
作为输入而不是array
可以涵盖所有用例。 - Sebastian Simon