java全排列

设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p)pn = p - {rn}

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1perm(p} = r1

实现java代码如下:

[c-sharp] view plain copy 

1. public class permutate {  

2.     public static int total = 0;  

3.     public static void swap(String[] str, int i, int j)  

4.     {  

5.         String temp = new String();  

6.         temp = str[i];  

7.         str[i] = str[j];  

8.         str[j] = temp;  

9.     }  

10.     public static void arrange (String[] str, int st, int len)  

11.     {  

12.         if (st == len - 1)  

13.         {  

14.             for (int i = 0; i < len; i ++)  

15.             {  

16.                 System.out.print(str[i]+ "  ");  

17.             }  

18.             System.out.println();  

19.             total++;  

20.         }  

21.         else  

22.         {  

23.             for (int i = st; i < len; i ++)  

24.             {  

25.                 swap(str, st, i);  

26.                 arrange(str, st + 1, len);  

27.                 swap(str, st, i);  

28.             }  

29.         }  

30.           

31.     }  

32.     /** 

33.      * @param args 

34.      */  

35.     public static void main(String[] args) {  

36.         // TODO Auto-generated method stub  

37.          String str[] = {"a","b","c"};  

38.          arrange(str, 0, str.length);  

39.          System.out.println(total);  

40.     }  

41. }  

关键的就是arrange方法的else里面的内容,我的理解是(以求str[] = {"a","b","c"}的排列为例子):

istr[st]做一遍循环:

每一次循环中,都要将str[i]str[i]互相调换位置:第一次开始,"a"与自己换,这时候,递归调用arrange[str,st + 1, len]

这是在求取str[str...len - 1]的排列即"b","c"的排列;

第二次,"a""b"互相调换,递归调用arrange[str,str + 1, len]就是在求取{"a","c"}的排列。

第三次,"a""c"互相调换,递归调用arrange[str, str + 1,len]就是在求取"{"b","a}的排列。

下面再以"b","c"的排列求取为例:

首先还是做循环,第一次,"b"与自己调换,这时候,调用arrange[str,st + 1,len], 就是求c的排列。呵呵,这时候终于到了函数递归调用的出口了

: st = len - 1。输出"b" "c";

第二次,类似的,输出"c","b";

至此,"b" "c"的排列求取完毕。加上前面的a,就输出"a""b""c" "a""c""b"

类似的,就可以输出所有的排列了。

猜你喜欢

转载自blog.csdn.net/boywcx/article/details/78035808