排列算法实现

来源:互联网 发布:末代沙皇的公主们 知乎 编辑:程序博客网 时间:2024/06/07 03:06

思想:永远取第一个元素去依次插入“剩于元素的排列”的任意位置

public class Arith{    public static void main(String[] args)    {        char[] chars = new char[] { 'a', 'b', 'c', 'd' };        Collection<char[]> coll =  permutation(chars);        for (char[] one : coll)        {            System.out.print(String.valueOf(one) + ",");        }        System.out.println();        System.out.println("size : " + coll.size()); // 结果为chars.size()的阶乘    }    /**     * 获得字符的全排列     * @param chars 字符集     * @return 全排列     */    static Collection<char[]> permutation(char[] chars)    {        Collection<char[]> coll = new HashSet<char[]>();        recursive(chars, coll);        return coll;    }    private static void recursive(char[] chars, Collection<char[]> coll)    {        char[] rest = null;        // 最后一个元素        if (chars.length == 1)        {            rest = new char[1];            rest[0] = chars[0];            coll.add(rest);            return;        }        // 1. 取第一个元素        char ch = chars[0];        char[] child = new char[chars.length - 1];        // 2. 剩下的元素        System.arraycopy(chars, 1, child, 0, chars.length - 1);        Collection<char[]> childColl = new HashSet<char[]>();        // 3. 剩下元素的全排列        recursive(child, childColl);        // 4. 插入“剩于元素的排列”的任意位置        for (char[] one : childColl)        {            for (int i = 0; i < chars.length; i++)            {                rest = new char[chars.length];                rest[i] = ch;                for (int j = 0; j < one.length; j++)                {                    if (j < i)                    {                        rest[j] = one[j];                    }                    else if (j >= i)                    {                        rest[j + 1] = one[j];                    }                }                coll.add(rest);            }        }    }}