您的位置:首页 > 编程语言 > Java开发

递归:全排列的java实现

2015-08-12 17:27 459 查看
全排列:比如有一组数123,它的全排列有123,132,213,231,321,312。下面的实现也考虑了重复的情况。

 

import java.util.Scanner;

public class Permlist {

/**
* R={r1,r2,r3...rn} n=1时,perm(R)=(r),其中r是集合R中的唯一元素
* n>1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3).....(rn)Perm(Rn)组成
*/
/* 交换 */
void Swap(int[] list, int a, int b) {
int temp = list[a];
list[a] = list[b];
list[b] = temp;
}

/* 递归排列 */
void Perm(int[] list, int k, int m) {
if (k == m) {

for (int i = 0; i <= m; i++) {

System.out.print(list[i]);
}
System.out.println("  ");
} else {
for (int i = k; i <= m; i++) {
if (Isswap(list, k, i)) { // 去重
Swap(list, k, i);  //???
Perm(list, k + 1, m);
Swap(list, k, i);   //???
}
}
}
}

/* 判断重复 */
boolean Isswap(int[] list, int a, int b) {
for (int i = a; i < b; i++)
if (list[i] == list[b])
return false;
return true;
}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入数组的长度");
int l = in.nextInt();
int[] list = new int[l];

for (int i = 0; i < l; i++) {
System.out.print("请输入全排列的第" + (i + 1) + "个元素");
list[i] = in.nextInt();
}
int k = 0;
int m = l - 1;
Permlist pl = new Permlist();
pl.Perm(list, k, m);

}

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