什么是全排列
把一组数组所有的排序可能都列出来就是全排列。
例子:
如果给1,2,3,4做全排列,第一个位置上就有4种可能1,2,3,4,假设第一个为4了,剩下的第二个位置可能是1,2,3,假设第二个位置是1,剩下的第三个位置可能是2,3,假设第三位置为3,最后一个位置是2,便可以输出为4,1,3,2,同理,如果到顺序第一个位置是3,便对剩下的3个数做递归排序……
子问题和父问题是同一件事并不断简单,有一个出口,便可以用递归。
代码如下:
public class QuanPaiLie {
public static void main(String[] args) {
int[] a={1,2};
f(a);
}
private static void f(int[] a) {
f(a,0);
}
private static void f(int[] a, int start) {
if (start==a.length-1){//开始位置到了末尾,结束条件
System.out.println(Arrays.toString(a));//便打印输出数组
return;//
}
for (int i = start; i <a.length ; i++) {//遍历数组
swap(a,i,start);//i的值和start的值交换,第一个元素和后面的做交换,递归调用子数组做排序
f(a,start+1);//对start+1开始的范围,递归进行全排列
swap(a,i,start);//i的值和start的值交换,把第一个元素交换回来
}
}
private static void swap(int[] a, int i, int start) {
int tem=a[i];
a[i]= a[start];
a[start]=tem;
}
}