全排列:比如有一组数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);
}
}