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, */