仅以此博客记录学习,侵权即删。
利用递归实现数组的全排列,个数为12***n
import java.util.Arrays;
public class permutation{
//s表示,从array[start]后的数据进行全排列
public static void permute(int[] array,int start){
if(start==array.length){ // 输出
System.out.println(Arrays.toString(array));
}
else
for(int i=start;i<array.length;++i){
swap(array,start,i); // 交换元素
permute(array,start+1); //交换后,再进行全排列算法
swap(array,start,i); //还原成原来的数组,便于下一次的全排列
}
}
private static void swap(int[] array,int s,int i){
int t=array[s];
array[s]=array[i];
array[i]=t;
}
public static void main(String[] args){
int[] array=new int[]{1,2,3};
permute(array,0);
}
}
//打印
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]
字符串全排列
ps:如果是字符,直接将String 换成char
直接将String 改成int就是数组,等同上面代码
import java.util.Arrays;
public class Test {
static String[] array = { "x", "y", "z" };
public static void main(String[] args) {
getAllOrder(0, array.length - 1);
}
public static void getAllOrder(int begin, int end) {
if (begin == end) {
check();
} else {
for (int i = begin; i <= end; i++) {
// 交换数据
swap(begin, i);
getAllOrder(begin + 1, end);
swap(i, begin);
}
}
}
public static void swap(int from, int to) {
// 这里应该加上各种防止无效交换的情况
// 比如位置相同,或者2个位置的数据相同
if (from == to) {
return;
}
String tmp = array[from];
array[from] = array[to];
array[to] = tmp;
}
public static void check() {
// 排列拿到了,可以进行你的判断了。
System.out.println(Arrays.toString(array));
}
}
//打印
[x, y, z]
[x, z, y]
[y, x, z]
[y, z, x]
[z, y, x]
[z, x, y]