排列算法大家谈的比较多了,组合的算法有点麻烦,我花了一些时间写了个组合算法。
我的组合算法的原理是:从第一个字母算起直到达选出的数量为止,比如是a,b,c,d选3,结果是
abc
abd
acd
bcd
用一个循环程序来实现:
public class MyCompositeLoop {
public static void main(String[] args){
char buf[]={'a','b','c','d'};
char container[] = new char[3];
for (int i=0;i<buf.length;i++){
container[0]=buf[i];
for(int j=i+1;j<buf.length;j++){
container[1]=buf[j];
for(int k=j+1;k<buf.length;k++){
container[2]=buf[k];
for(int g=0;g<container.length;g++){
System.out.print(container[g]);
}
System.out.println("");
}
}
}
}
}
程序很简单选几字母就循环几次,在最里边的循环中输出结果。
但是这个循环程序不能解决一般的n个字母选m个的问题,只是最终程序的一个思路铺垫,最终的程序是用递归来实现的:
public class MyComposite {
static int level=-1;//目前处在第几级的循环中
static int count = 1;//打出目前的组合数
static int selected = 3;//选出几个字母
public static void main(String[] args){
char buf[]={'a','b','c','d'};
List container = new ArrayList();
composite(container,buf,0,buf.length);
}
public static void composite(List container,char buf[],int start,int end){
if(container.size()== selected){
for(int i=0;i<container.size();i++){
System.out.print(container.get(i));
}
System.out.println();
if(level>=selected-1){
level =selected-1;
}
System.out.println(count);
count++;
}else{
if(start>=end){
level--;
}else{
for(int i=start;i<end;i++){
if(level == -1){
level = 0;
}
for(int m=0;m<selected-(level);m++){
if(container.size()>=selected-m){
container.remove(selected-1-m);
}
}
level++;
container.add(buf[i]);
composite(container,buf,i+1,end);
if(i+1>=end){
level--;
}
}
}
}
}
}
这个递归算法的难点就在于确认目前正处于第几级的循环中,要把无用的字母从list中去除掉