当前位置: 代码迷 >> J2SE >> 新手请问JAVA全排列
  详细解决方案

新手请问JAVA全排列

热度:44   发布时间:2016-04-23 21:14:38.0
新手请教JAVA全排列
public class AllSort{  
    public static void main(String[] args) {  
        char buf[]={'a','b','c',‘d’,‘e’}; 

        perm(buf,0,buf.length-1);  
    }  
    public static void perm(char[] buf,int start,int end){  
        if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可(特殊情况)  
            for(int i=0;i<=end;i++){  
                System.out.print(buf[i]);  
            }  
            System.out.println();     
        }  
        else{
            for(int i=start;i<=end;i++){
                char temp=buf[start];
                buf[start]=buf[i];  
                buf[i]=temp;  
                  
                perm(buf,start+1,end);
                  
                temp=buf[start];
                buf[start]=buf[i];  
                buf[i]=temp;  
            }  
        }  

谁能解释一下else后面的语句到底是怎样运行的吗 
如果可以的话用abcde作为初始数组进行排列 
让我看一下过程
我现在需要画这个的一个程序的流程图 
在这个地方引进其他判断方法时搞晕了
谢谢

------解决方案--------------------
假设输入集合为abc (abcde太长了,不方便解释)。
固定a, 求后面bc的全排列,abc,acb. 求好后,将abc中,a和b对调,得到bac
固定b,求后面ac的全排列,bac,bca,求好后,将abc中,a和c对调,得到cba
固定c,求后面ba的全排列,cba,cab,求好后,结束。
关键是理解两个交换值的部分:
         第一个交换目的从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列
          第二个交换目的是恢复被perm函数交换前的排列,因此总是对abc中的元素做对调
  相关解决方案