您的位置:首页 > 其它

一个全排列的生成算法

2009-10-09 17:36 411 查看
/**
* 全排列生成算法
* 实现枚举A(n,n)
*/
package sur;

import java.util.Scanner;

/**
* @author lgj
* @time 2009.10.06
*
*/
public class Arrangement {

/**
* @param args[0]  n
*/
static int n;
private static int[] p ;//without using of p[0]&p

public static void main(String[] args) {
//n = Integer.parseInt(args[0]);
System.out.println("Please Input n:");
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
int[] a = new int[n+1];//without using of a[0]
boolean[] tag = new boolean[n+1];
p = new int[n+1];
int i,j,k;
for(i=0;i<=n;i++) { p[i]=0;tag[i]=false;}
do {
//for(i=0;i<=n;i++)  tag[i]=false;
for(i=n-1;i>0;i--) {
System.out.print(p[i]);
j=n;k=0;
while(j>0) {
if(k==p[i]&&tag[j]==false)
break;
if(!tag[j])
k++;
j--;
}
a[j]=i+1;
tag[j]=true;
}
for(i=0;i<=n;i++) {
if(tag[i]==false) //找到没赋值的地方 赋1
a[i]=1;
else
tag[i]=false;
}

System.out.print("  ");
for(i=1;i<=n;i++)
System.out.print(a[i]);
System.out.println();
}while(GetNextPi());
}

private static boolean GetNextPi() {

p[1]++;
int i=1;
while(p[i]>i){
p[i]=0;
i++;
p[i]++;
}
if(i>=n&&p[i]>=n)
return false;
return true;
}
}


实现了自然数1~n 的实现全排列

参考 《组合数学(第二版)》 卢开成 卢华明著 清华大学出版社 2002

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: