【OJ】全排列递归算法

算法思想:求n位的字符串的全排列,先确定第0位,然后对后面n-1位进行全排列,在对n-1为进行全排列时,先确定第1位,然后对后面的n-2位进行全排列...由此得到递归函数和递归的结束条件。全排列也就是交换位置,到n-2位时,就是将n-2和n-1交换位置。

例子:abc,第一位是a固定,对后面的bc交换位置得abc,acb.
当a和b交换位置之后,得到bac,对ac进行全排列bac,bca.
当a和c交换位置之后,得到cba,对ba进行全排列得cba,cab.

package test;

import java.util.Arrays;

public class quanpailie {
    // 需要被全排列的数组
    private static String[] arr = "a,b,c,d".split(",");

    public static void main(String[] args) {
        rangeAll(arr, 0);
    }

    /**
     * 全排列指定数组
     * 
     * @param arr
     *            需要被全排列的数组
     * @param n
     *            记录递归的层数(从0开始)
     */
    public static void rangeAll(String[] arr, int n) {
        if (n == arr.length) {
            // 打印数组
            System.out.println(Arrays.toString(arr));
            return;
        }
        for (int i = n; i < arr.length; i++) {
            swap(arr, n, i);
            rangeAll(arr, n + 1);
            swap(arr, n, i);
        }
    }

    /**
     * 交换数组中指定的两个数
     * 
     * @param arr
     * @param i
     * @param j
     */
    public static void swap(String[] arr, int i, int j) {
        if (i == j) {
            return;
        }
        String temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

  

posted @ 2018-08-16 00:10  陈泽泽  阅读(507)  评论(0编辑  收藏  举报