代码改变世界

递归分治算法计算全排列

2011-08-26 23:25  Rollen Holt  阅读(1044)  评论(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;
	}
	
	
}

不知道大家除了建立类,还有其他什么方法交换吗?希望提醒一下,谢谢。