/***
* 指定元素的排序可能
*/
function FullOrder(arr){
var permutatedArray = [];
if(arr.length > 1){
permutatedArray.push([arr.pop()]);
for(var i = 0; i < arr.length; i++){
var elementCur = arr[i];
//这里很关键,必须先取len,因为后面数组长度会变化
var len = permutatedArray.length;
for(var j = 0; j < len; j++){
var p = permutatedArray.shift();
for(var n = 0; n <= p.length; n++){
//复制排列好的数组
var r = p.slice(0);
//插入数据到数组的位置
r.splice(n, 0, elementCur);
//保存
permutatedArray.push(r)
}
}
}
}else{
return permutatedArray.push([array[0]]);
}
return permutatedArray;
}
/**
* 指定数量的排列组合
*/
function NumberPermutation(arr, size) {
var allResult = [];
(function (arr, size, result) {
var arrLen = arr.length;
if (size > arrLen) {
return;
}
if (size == arrLen) {
allResult.push([].concat(result, arr))
} else {
for (var i = 0; i < arrLen; i++) {
var newResult = [].concat(result);
newResult.push(arr[i]);
if (size == 1) {
allResult.push(newResult);
} else {
var newArr = [].concat(arr);
newArr.splice(0, i + 1);
arguments.callee(newArr, size - 1, newResult);
}
}
}
})(arr, size, []);
return allResult;
}
/**
* 全排列(从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来)
*/
function FullPermutation(arr) {
const result = [];
for(let i = 0, len = arr.length; i< len; i++){
result.push(...NumberPermutation(arr, i + 1))
}
return result;
}
console.log(FullOrder([1,2,3]))
console.log('-')
console.log(NumberPermutation([1,2,3], 2))
console.log('-')
console.log(FullPermutation([1,2,3]))
上述代码运行结果: