zoukankan      html  css  js  c++  java
  • 打印全排列

    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, 
    */
  • 相关阅读:
    LeetCode题目(python)
    解决:centos配置ssh免密码登录后仍要输入密码
    解决 find: 路径必须在表达式之前:
    --解决Lock wait timeout exceeded; try restarting transaction
    Linux文件删除,但是df之后磁盘空间没有释放
    定位class时空格注意
    解决jenkins的Console Output中文乱码
    CPU飙升问题排查
    JVM笔记
    List集合的使用
  • 原文地址:https://www.cnblogs.com/chaohi/p/2330334.html
Copyright © 2011-2022 走看看