递归分治算法计算全排列
2011-08-26 23:25 Rollen Holt 阅读(1054) 评论(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
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员
==============================================================================
浙公网安备 33010602011771号