import java.util.LinkedList;
import java.util.Queue;
/**
* 打印全排列
*
* 采用的是递归算法。
* 数学根据:m个数的全排列可由第m个数分别往其余
* m-1个数的所有全排列的m个不同位置插空而得到。
*
* 可以用进位制的思想来解决排列问题。
* 只是需要每次得到的进位制字符串中各位均不相同而已!!!
* 可参看数独算法中用进位制得到所有四则运算排列的例子。
*
* 递归和数学归纳法很相似,都是先解决临界点(n=1)的情况,
* 然后通过n,到达n+1.
*
* @author tiger
* @date 2010-07-21 周三 1:04
* 于赤沙石伦里横街15号402。
*/
@SuppressWarnings("unchecked")
public class pailie {
private int[] array = {1,2,3,4};
//行动
private void action()
{
Queue q = getNewQueue(array.length - 1);
System.out.println(array.length + "个数可以形成的全排列有" + q.size() + "个!");
System.out.println("所有排列如下所示:");
while(!q.isEmpty()){
int[] array = (int[]) q.poll();
print(array);
}
}
// 递归逻辑
private Queue getNewQueue(int index)
{
Queue q = new LinkedList();
if(index == 0)
{
q.offer(new int[]{array[0]});
}else{
Queue q1 = getNewQueue(index - 1);
while(!q1.isEmpty()){
int[] a = (int[]) q1.poll();
for (int j = 0; j <= a.length; j++) {
int[] b = insertElement(a, j, array[index]);
q.offer(b);
}
}
}
return q;
}
//插入数组指定位置、返回新数组
private int[] insertElement(int[] array, int index, int element)
{
int length = array.length + 1;
int[] newArray = new int[length];
for (int i = 0; i < length; i++) {
if(i < index)
{
newArray[i] = array[i];
}
else if(i == index)
{
newArray[i] = element;
}else if(i > index)
{
newArray[i] = array[i - 1];
}
}
return newArray;
}
//打印之
private void print(int[] a)
{
for (int i = 0; i < a.length ; i++) {
System.out.print(a[i] + ", ");
}
System.out.println();
}
//程序入口
public static void main(String[] args) {
pailie p = new pailie();
p.action();
}
}
/*打印结果如下:
4个数可以形成的全排列有24个!
所有排列如下所示:
4, 3, 2, 1,
3, 4, 2, 1,
3, 2, 4, 1,
3, 2, 1, 4,
4, 2, 3, 1,
2, 4, 3, 1,
2, 3, 4, 1,
2, 3, 1, 4,
4, 2, 1, 3,
2, 4, 1, 3,
2, 1, 4, 3,
2, 1, 3, 4,
4, 3, 1, 2,
3, 4, 1, 2,
3, 1, 4, 2,
3, 1, 2, 4,
4, 1, 3, 2,
1, 4, 3, 2,
1, 3, 4, 2,
1, 3, 2, 4,
4, 1, 2, 3,
1, 4, 2, 3,
1, 2, 4, 3,
1, 2, 3, 4,
*/