打印全排列

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, 
*/
原文地址:https://www.cnblogs.com/chaohi/p/2330334.html