此段代码为一个求数组所有排列组合的方法,当数组元素个数大于7时,运行效率及底,有什么更好的方法改进他的算法,愿请达人帮助
<SCRIPT LANGUAGE="JavaScript">
<!--
/**
* 克隆数组
*/
Array.prototype.clone = function () {
return this.concat();
};
/**
* 按指定的顺序数组重新排列
*/
Array.prototype.reOrder = function ( aOrder ) {
var aClone = this.clone();
for (var i=0; i < aOrder.length; i++) {
this[aOrder[i]] = aClone[i];
}
return this;
};
/**
* 取得 0 到 iLen 的所有排列顺序
*/
function getOrders( iLen ) {
var aResult = [];
var aNum = [];
var aNumFlag = [];
var i, j;
for(i = 0; i < iLen; i++) {
aNum[i] = i,
aNumFlag[i] = 1;
}
for(;;){
aResult.push(aNum.clone());
aNumFlag[aNum[iLen-1]] = 0;
for(i = iLen - 2; i>=0; i--){
aNumFlag[aNum[i]] = 0;
if(aNum[i] < aNum[i+1]) {
break;
}
}
if( i < 0) {
break;
}
for(j = aNum[i] + 1; j < iLen; j++){
if(!aNumFlag[j]) {
break;
}
}
aNumFlag[j] = 1;
aNum[i] = j;
for(j=0, i++; i < iLen; j++) {
if(!aNumFlag[j]) {
aNum[i++] = j;
aNumFlag[j] = 1;
}
}
}
return aResult;
}
/**
* 生成数组的全排列
* 方法: 先生成数组长度以下的所有顺序, 然后根据顺序数组重排原数组
*/
function arrayInAllOrder( aData ) {
var aResult = [];
var aOrders = getOrders(aData.length);
var aOrder = aOrders.shift();
while(aOrder) {
aResult.push(aData.clone().reOrder(aOrder));
aOrder = aOrders.shift();
}
return aResult;
}
var others=new Array();
others[0]=0;
others[1]=1;
others[2]=2;
others[3]=3;
others[4]=4;
others[5]=5;
others[6]=6;
others[7]=7;
// others[8]=8;
// others[9]=9;
var result=arrayInAllOrder(others);
alert(result.length);
//-->
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
<!--
/**
* 克隆数组
*/
Array.prototype.clone = function () {
return this.concat();
};
/**
* 按指定的顺序数组重新排列
*/
Array.prototype.reOrder = function ( aOrder ) {
var aClone = this.clone();
for (var i=0; i < aOrder.length; i++) {
this[aOrder[i]] = aClone[i];
}
return this;
};
/**
* 取得 0 到 iLen 的所有排列顺序
*/
function getOrders( iLen ) {
var aResult = [];
var aNum = [];
var aNumFlag = [];
var i, j;
for(i = 0; i < iLen; i++) {
aNum[i] = i,
aNumFlag[i] = 1;
}
for(;;){
aResult.push(aNum.clone());
aNumFlag[aNum[iLen-1]] = 0;
for(i = iLen - 2; i>=0; i--){
aNumFlag[aNum[i]] = 0;
if(aNum[i] < aNum[i+1]) {
break;
}
}
if( i < 0) {
break;
}
for(j = aNum[i] + 1; j < iLen; j++){
if(!aNumFlag[j]) {
break;
}
}
aNumFlag[j] = 1;
aNum[i] = j;
for(j=0, i++; i < iLen; j++) {
if(!aNumFlag[j]) {
aNum[i++] = j;
aNumFlag[j] = 1;
}
}
}
return aResult;
}
/**
* 生成数组的全排列
* 方法: 先生成数组长度以下的所有顺序, 然后根据顺序数组重排原数组
*/
function arrayInAllOrder( aData ) {
var aResult = [];
var aOrders = getOrders(aData.length);
var aOrder = aOrders.shift();
while(aOrder) {
aResult.push(aData.clone().reOrder(aOrder));
aOrder = aOrders.shift();
}
return aResult;
}
var others=new Array();
others[0]=0;
others[1]=1;
others[2]=2;
others[3]=3;
others[4]=4;
others[5]=5;
others[6]=6;
others[7]=7;
// others[8]=8;
// others[9]=9;
var result=arrayInAllOrder(others);
alert(result.length);
//-->
</SCRIPT>