先说一下全排列:
对于R={r1,r2,…,rn},进行n个元素的全排列,设Ri=R – {ri}。结合X元素的全排列记为Perm(X),(ri)Perm(X)表示在全排列Perm(X)的每个排列前面加上前缀ri的得到的序列。R的全排列可归纳定义如下:
n=1时,Perm(R)=(r),其中r是R中的唯一元素;
n>1时,Perm(R)由(r1)Perm(R1), (r2)Perm(R2),…, (rn)Perm(Rn)构成。
显然,部分排列,只要控制递归结束条件即可。
再说组合:
组合与排列相比,忽略了元素的次序,因此我们只需将元素按编号升序排列(或则其他的规则)即可。
代码如下:


public class Main
{
static int count;

public static void main(String[] args)
{

int a[] =
{1, 2, 3, 4};
count = 0;
permutation(a, 0, 4);
System.out.println("count=" + count);
count = 0;
combination(a, 0, 3, 0);
System.out.println("count=" + count);
}

static void combination(int a[], int nowp, int m, int left)
{//zuhe

/**//*
* 求a[]中m个元素的组合
* nowp表示当前已经组合好的元素的个数
* left,只能选择编号为left和它之后的元素 进行交换
*/

if(nowp == m)
{
count++;

for(int i = 0; i < m; i++)
{
System.out.print(a[i] + " ");
}
System.out.println();
}

else
{

for(int i = left; i < a.length; i++)
{
swap(a, nowp, i);
combination(a, nowp + 1, m, i + 1);
swap(a, nowp, i);
}
}
}

static void permutation(int a[], int nowp, int m)
{// pailie

/**//*
* 求a[]m个元素的排列
* nowp,当前已经排列好的元素的个数
*/

if(nowp == m)
{
count++;

for(int i = 0; i < m; i++)
{
System.out.print(a[i] + " ");
}
System.out.println();
}

else
{

for(int i = nowp; i < a.length; i++)
{
swap(a, i, nowp);
permutation(a, nowp + 1, m);
swap(a, i, nowp);
}
}
}

static void swap(int a[], int n, int m)
{
int t = a[n];
a[n] = a[m];
a[m] = t;
}

}

posted on 2013-07-06 10:54
小鼠标 阅读(1325)
评论(0) 编辑 收藏 引用 所属分类:
Java基础练习