Chinaunix首页 | 论坛 | 博客
  • 博客访问: 87534
  • 博文数量: 19
  • 博客积分: 1863
  • 博客等级: 上尉
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-20 13:58
文章分类
文章存档

2013年(2)

2012年(3)

2011年(12)

2010年(2)

我的朋友

分类: Java

2013-05-31 17:12:35





/**
 * @author super
 * @since 2013-5-31 下午2:28:59
 * @version 1.0
 */
import java.util.Stack;


/**
 * JAVA获得一个数组的指定长度的排列组合。

 *
 * @author JAVA世纪网(java2000.net, laozizhu.com)
 */
public class TestSequenceAll {
    public static void main(String[] args) {
        TestSequenceAll t = new TestSequenceAll();
        // int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
        int[] arr = {1, 2, 3, 4, 5};
        // 循环获得每个长度的排列组合
        for (int num = 1; num <= arr.length; num++) {
            t.getSequence(arr, 0, num);
        }
    }


    // 存储结果的堆栈
    private Stack stack = new Stack();


    /**
     * 获得指定数组从指定开始的指定数量的数据组合

     *
     * @param arr
     *            指定的数组
     * @param begin
     *            开始位置
     * @param num
     *            获得的数量
     */
    public void getSequence(int[] arr, int begin, int num) {
        if (num == 0) {
            System.out.println(stack); // 找到一个结果
        } else {
            // 循环每个可用的元素
            for (int i = begin; i < arr.length; i++) {
                if (stack.size() > 0) {
                    int tmp = stack.pop();
                    if (arr[i] < tmp){
                        stack.push(tmp);
                        continue;
                    }
                    else
                        stack.push(tmp);
                }
                // 当前位置数据放入结果堆栈
                stack.push(arr[i]);
                // 将当前数据与起始位置数据交换
                swap(arr, begin, i);
                // 从下一个位置查找其余的组合
                getSequence(arr, begin + 1, num - 1);
                // 交换回来
                swap(arr, begin, i);
                // 去除当前数据
                stack.pop();
            }
        }
    }


    /**
     * 交换2个数组的元素
     *
     * @param arr
     *            数组
     * @param from
     *            位置1
     * @param to
     *            位置2
     */
    public static void swap(int[] arr, int from, int to) {
        if (from == to) {
            return;
        }
        int tmp = arr[from];
        arr[from] = arr[to];
        arr[to] = tmp;
    }
}

阅读(3264) | 评论(0) | 转发(0) |
0

上一篇:Emacs配置文件(save for later use )

下一篇:没有了

给主人留下些什么吧!~~