n个元素的全排列

Posted foxobedient

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n个元素的全排列相关的知识,希望对你有一定的参考价值。

 1 //求n个元素的全排列
 2 //abc  acb  bac  bca  cab  cba
 3 
 4 public class FullPermutation {
 5 
 6     public static void f(char[] data,int k)
 7     {//k表示当前的交换位置(关注点),与其后的元素交换
 8         
 9         if(k==data.length){//此处写length和length-1都可以,前者会溢出但是不会有影响,后者效率更高一点
10             for(int i=0;i<data.length;i++) System.out.print(data[i]+" ");
11             System.out.println();
12         }
13         
14         for(int i=k;i<data.length;i++){
15             {char t = data[k];
16             data[k] = data[i];
17             data[i]=t;}//试探  c b a d
18             f(data,k+1);
19             {char t = data[k];
20             data[k] = data[i];
21             data[i]=t;}//回溯,换之后还要换回去 a b c d
22         }
23     }
24     
25     public static void f2(char[] data){
26         
27         if(data.length==1){
28             /*for(int i=0;i<data.length;i++)System.out.print(data[i]+" ");
29             System.out.println();*/
30             System.out.println(data);
31         }
32         
33         for(int i=0;i<data.length;i++){
34             {
35                 char t=data[0];
36                 data[0]=data[i];
37                 data[i]=t;
38                 //System.out.println(data[0]);
39             }
40             String str = new String(data);
41             f2(str.substring(1).toCharArray());
42             {
43                 char t=data[0];
44                 data[0]=data[i];
45                 data[i]=t;
46             }
47         }
48     }
49     
50     public static void main(String[] args) {
51         char[] data="ABC".toCharArray();    //将“ABCDE”这个字符串转化成字符数组
52         //f(data,0);
53         f2(data);
54     }
55 }

Notes

此题选用了两种方法,

第一种:使用的是f(char[] data,int k)两个参数,重点在于k指的是当前数组中我们关注的位置

第二种:采用f2(char[] data),将char类型的数组ABC先转变成String类型,再截取字串进行交换;

    此处我一开始使用的是 toString方法,结果当然不对,因为toString() 方法的作用是:可把一个逻辑值转换为字符串,并返回结果;

    字符数组转化成字符串应该使用:String str = new String(data);

而这两种方法都要注意点:这里使用了回溯法,回溯法要注意,交换过后必须要交换回去

ps:第二种办法暂时还没找到如何正确打印or出口,目前只是打印出每中全排列的最后一位。。。

以上是关于n个元素的全排列的主要内容,如果未能解决你的问题,请参考以下文章

有重复元素的全排列

n个元素中有m个相同的元素,则这n个元素的全排列的种数是

算法习题---字符串的全排序列

生成n个元素的全排列 C实现

编写一个递归算法,输出自然数1,2,…,n这n个元素的全排列

PHP实现全排列(递归算法)