递归分治算法计算全排列
2011-08-26 23:25 Rollen Holt 阅读(1049) 评论(0) 编辑 收藏 举报其实计算全排列本人所知有字典序法,还有一个在组合数学中学到的,忘记了,呵呵。不好意思。大家可以Google一下。
下面这个例子是我练习递归分治算法的时候设计的,呵呵,大家指针批评。
/** * @author Rollen-Holt * 递归分治算法计算全排列 * */ public class Perm{ public static void main(String[] args){ int[] data={1,2,3,4}; perm(data,0,data.length-1); } /** * 产生data[start:end]的所有排列 * */ public static void perm(int data[],int start,int end){ if(start==end){ for(int i = 0; i <=end; i++) { System.out.print(data[i]+" "); } System.out.println(); }else{ //还有多个元素的待排列 for(int i=start;i<=end;++i){ //先交换顺序 int temp=data[start]; data[start]=data[i]; data[i]=temp; //递归调用 perm(data, start+1, end); //在此交换顺序 temp=data[start]; data[start]=data[i]; data[i]=temp; } } } }
【运行结果】:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 3 2
1 4 2 3
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 3 1
2 4 1 3
3 2 1 4
3 2 4 1
3 1 2 4
3 1 4 2
3 4 1 2
3 4 2 1
4 2 3 1
4 2 1 3
4 3 2 1
4 3 1 2
4 1 3 2
4 1 2 3
PS:下面扯一点其他的。本算法中用到了基本数据交换的,但是java的叫我不爽,呵呵。
/** * java中值的交换 * */ public class test{ public static void main(String[] args){ Integer a=1; Integer b=2; swap3(a,b); System.out.println(a); System.out.println(b); } //这个函数不能实现交换 public static void swap1(int a,int b){ int temp=a; a=b; b=temp; } //可以利用数组实现交换 public static void swap2(int[] a){ int temp=a[0]; a[0]=a[1]; a[1]=temp; } //本打算测试一下自动拆箱和装箱,结果还是不行 public static void swap3(Integer a,Integer b){ Integer temp=a; a=b; b=temp; } }
不知道大家除了建立类,还有其他什么方法交换吗?希望提醒一下,谢谢。
==============================================================================
本博客已经废弃,不在维护。新博客地址:http://wenchao.ren
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员
==============================================================================