`

[转]全排列 - 非递归实现

阅读更多
import java.math.BigInteger;

public class PermutationGenerator {

    private int[] a;
    private BigInteger numLeft;
    private BigInteger total;
    
    public PermutationGenerator(int n) {
        if (n < 1) {
            throw new IllegalArgumentException("Min 1");
        }
        a = new int[n];
        total = getFactorial(n);
        reset();
    }

    public void reset() {
        for (int i = 0; i < a.length; i++) {
            a[i] = i;
        }
        numLeft = new BigInteger(total.toString());
    }

    public boolean hasMore() {
        return numLeft.compareTo(BigInteger.ZERO) == 1;
    }

    //得到组合的总数
    private static BigInteger getFactorial(int n) {
        BigInteger fact = BigInteger.ONE;
        for (int i = n; i > 1; i--) {
            fact = fact.multiply(new BigInteger(Integer.toString(i)));
        }
        return fact;
    }

    public int[] getNext() {

        if (numLeft.equals(total)) {
            numLeft = numLeft.subtract(BigInteger.ONE);
            return a;
        }

        // Find largest index j with a[j] < a[j+1]
        int j = a.length - 2;
        while (a[j] > a[j + 1]) {
            j--;
        }

        //a[]从右向左,找index k,使得a[k]>a[j]
        int k = a.length - 1;
        while (a[j] > a[k]) {
            k--;
        }
        //a[j]a[k]互换
        interchange(a, j, k);

        //如果j不是倒数第二个index,则将j+1到a结尾的所有元素,对称互换
        int r = a.length - 1;
        int s = j + 1;
        while (r > s) {
        	interchange(a, r, s);
            r--;
            s++;
        }

        numLeft = numLeft.subtract(BigInteger.ONE);
        return a;

    }
    
    private static int[] interchange(int[] arr, int indexA, int indexB) {
    	int temp = arr[indexA];
    	arr[indexA] = arr[indexB];
    	arr[indexB] = temp;
    	return arr;
    }
    
    //测试
    public static void main(String[] args) {

        int[] indices;
        String[] elements = new String[]{"a", "b", "c"};
        PermutationGenerator x = new PermutationGenerator(elements.length);
        StringBuffer permutation;

        while (x.hasMore()) 
        {
            permutation = new StringBuffer("%");
            indices = x.getNext();
            for (int i = 0; i < indices.length; i++) {
                permutation.append(elements[indices[i]]).append("%");
            }
            System.out.println(permutation.toString());
        }
    }
}
OUTPUT:
%a%b%c%
%a%c%b%
%b%a%c%
%b%c%a%
%c%a%b%
%c%b%a%
分享到:
评论

相关推荐

    全排列的非递归实现JAVA

    全排列的非递归实现。 输入1,2,3,4 得到 [1 2 3 4]..........[4 3 2 1]所有24种排列

    非递归对输入的数字进行全排列_C语言实现

    上传之后才发现头文件少了个ctype.h,因为判断非法输入的时候用到了isalpha(),不加这个头文件的话在gcc下会有警告,在VC下可能编译不过! 首先把输入的各个数由小到大进行排序,然后开始 1.找出比右边数字小的第一...

    全排列算法的非递归实现与递归实现的方法(C++)

    本篇文章是对全排列算法的非递归实现与递归实现的方法进行了详细的分析介绍,需要的朋友参考下

    不得不说的全排列算法递归实现

    不得不说的全排列算法递归实现 我真的是菜啊,留的算法作业几乎没有一次自己写出来过…都是要上网看别人的博客才能懂,自己好笨好菜,

    全组合的递归实现JAVA

    全排列的非递归实现。输入1,2,3 得到 [1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]六种组合

    python非递归全排列实现方法

    下面小编就为大家带来一篇python非递归全排列实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    全排列问题.ppt

    全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下...

    字符串处理常见算法实现

    插入排序、一个英文句子单词逆转,字符串循环移位、去重、全排列算法(递归和非递归实现)、KMP算法

    C#实现排列组合算法完整实例

    其实排列实现了,组合也就实现了,组合C(N,R)就是P(N,R)/P(R,R) ,实现这一功能比较简单的是递归算法,但考虑到递归的性能,下面采用了2种非递归的方法,具体代码如下 using System; using System.Collections....

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    7.13 递归函数的非递归求解 7.14 任意长度整数加法 第8章 数值计算问题 8.1 递推化梯形法求解定积分 8.2 求解低阶定积分 8.3 迭代法开平方运算 8.4 牛顿法解方程 8.5 欧拉方法求解微分方程 8.6 改进的欧拉方法求解...

    常用算法代码

    递归方法求解排列组合问题 30 | 类循环排列 30 | 全排列 30 | 不重复排列 30 | 全组合 31 | 不重复组合 31 | 应用 31 模式串匹配问题总结 32 | 字符串 HASH 32 | KMP 匹配算法 O(M+N) 32 | KARP-RABIN ...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境...123 &lt;br&gt;0209 如何使用正则表达式验证密码长度 124 &lt;br&gt;0210 如何使用正则表达式验证非零的正整数 124 &lt;br&gt;0211 如何使用正则表达式验证非零...

    程序员面试攻略 part1(共2个)

    从求职到面试,从数据结构到算法,从智力题到非技术题,无不一一涵盖。急上网搜之,得矣。列诸信息及下载地址,供大家参考。同时也祝贺找工作完全进入应试时代…… 《程序员面试攻略》(Programming Interview ...

    程序员面试攻略part 2(共2个)

    从求职到面试,从数据结构到算法,从智力题到非技术题,无不一一涵盖。急上网搜之,得矣。列诸信息及下载地址,供大家参考。同时也祝贺找工作完全进入应试时代…… 《程序员面试攻略》(Programming Interview ...

Global site tag (gtag.js) - Google Analytics