全排列

/**
 * Created by Methol on 2015/4/10.
 * 根据A数组的大小,输出 1 ~ A.length 的全排列
 */
public class Main {

    static int A[] = new int[5];

    /*
     根据A数组的大小,输出 1 ~ A.length 的全排列
     @param cur 当前元素的位置
     */
    public static void next_permutation(int cur) {
        if (cur == A.length) {         //递归边界
            //在这里打印输出,也就是说在这里写具体要操作的函数,A中有排列好的序列
            for (int i = 0; i < A.length; i++) {
                System.out.print(A[i] + " ");
            }
            System.out.println();
        } else {
            for (int i = 0; i <= A.length; i++) {
                boolean ok = true;
                for (int j = 0; j < cur; j++) {
                    if (A[j] == i) ok = false;         //如果i已经在A[0]~A[cur-1]出现过,则不能再选
                }
                if (ok) {
                    A[cur] = i;
                    next_permutation(cur + 1);    //递归调用
                }
            }
        }
    }

    public static void main(String[] args) {
        next_permutation(0);
    }

}

/**
 * Created by Methol on 2015/4/10.
 * 输出数组P中元素的全排列。
 */
public class Main {
 
  static int A[] = new int[5];
  static int P[] = {1,2,3};
 
  /*
   输出数组P中元素的全排列。
   @param cur 当前元素的位置
   */
  public static void next_permutation(int cur) {
    if (cur == P.length) {         //递归边界
      //在这里打印输出,也就是说在这里写具体要操作的函数,A中有排列好的序列
      for (int i = 0; i < P.length; i++) {
        System.out.print(A[i] + " ");
      }
      System.out.println();
    } else {
      for (int i = 0; i < P.length; i++) {
        if(i==0 || P[i]!=P[i-1]) {
          int c1 = 0 ,c2 = 0;
          //统计A[0]~A[cur-1]中P[i]出现的次数
          for (int j = 0; j < cur ; j++)
            if(A[j] == P[i])  c1++;
          //统计P中P[i]出现的次数
          for (int j = 0; j < P.length; j++)
            if( P[i] == P[j] )  c2++;
          if(c1 < c2){   //当c1<c2的时候说明还有可以选的,递归调用
            A[cur] = P[i];
            next_permutation(cur+1);
          }
        }
      }
    }
  }
   
  public static void main(String[] args) {
    next_permutation(0);
  }
 
}