给出问题:
假如给出一个字符数组 a,b,c请设计算法列出由a,b,c所有排列的通用算法。
如给出的是 a,b,c 则全排列为:
abc
bac
bca
cba
cab
acb
这个问题看似简单,但是真做起来也不是那么的容易,解决的算法很多,这里给出一种较为简单的算法,复杂度为O(n2):
package com.xhinker;
public class FullArray {
public String[] s={"a","b","c"};
public void run(){
int j2; //指向要对换的位置
int sLength=s.length;
for(int i=0;i<getP(s.length);i++){ //外层循环以便获取全部组合
String[] tempString=s.clone(); //由于对象传的是句柄也就是地址,因此为保证原来数组不变,必须使用对象克隆
for(int j=0;j<i;j++){ //i次的对换
j2=j%(sLength-1);
change(j2,tempString);
}
for(int l=0;l<sLength;l++){ //输出这一次对换后的排列
System.out.print(tempString[l]);
}
System.out.println();
}
}
public int getP(int i){ //获得全排列数all
int all=1;
for(int j=i;j>0;j--){
all=all*j;
}
return all;
}
public void change(int i,String[] tempString){//
String t="";
t=tempString[i];
tempString[i]=tempString[i+1];
tempString[i+1]=t;
}
public static void main(String[] args){
FullArray fa=new FullArray();
fa.run();
}
}
public String[] s={"a","b","c"};
public void run(){
int j2; //指向要对换的位置
int sLength=s.length;
for(int i=0;i<getP(s.length);i++){ //外层循环以便获取全部组合
String[] tempString=s.clone(); //由于对象传的是句柄也就是地址,因此为保证原来数组不变,必须使用对象克隆
for(int j=0;j<i;j++){ //i次的对换
j2=j%(sLength-1);
change(j2,tempString);
}
for(int l=0;l<sLength;l++){ //输出这一次对换后的排列
System.out.print(tempString[l]);
}
System.out.println();
}
}
public int getP(int i){ //获得全排列数all
int all=1;
for(int j=i;j>0;j--){
all=all*j;
}
return all;
}
public void change(int i,String[] tempString){//
String t="";
t=tempString[i];
tempString[i]=tempString[i+1];
tempString[i+1]=t;
}
public static void main(String[] args){
FullArray fa=new FullArray();
fa.run();
}
}
允许使用和任意转载,但请注明出处和算法的作者。
本文转自 xhinkerx 51CTO博客,原文链接:http://blog.51cto.com/xhinker/131949,如需转载请自行联系原作者