美文网首页
输出指定集合元素全排列

输出指定集合元素全排列

作者: 张晓鱼 | 来源:发表于2018-10-19 13:32 被阅读0次
算法分析

假设待全排列元素集合为[1],其中有一个元素1,那么全排列的所有序列为‘1’,如果此时集合为[1,2]也就是增加一个元素2,那么所有可能的序列为'2,1','1,2'。如果此时集合为[1,2,3],那么所有可能的序列为'3,2,1','2,3,1','2,1,3'和'3,1,2','1,3,2','1,2,3'。通过前面的分析其实很容易看到每增加一个元素,所对应的全排列的所有可能的序列就是在原有基础上的每一个序列的从前到后的位置上依次插入新增元素,当这样操作一遍之后就可以得到所有可能的序列。

Java代码实现
package zhangyuyao.algorithm;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * 全排列
 */
public class Arrangement {


    /**
     * @param args
     */
    public static void main(String[] args) {

        // 创建待测试的数据
        List<Integer> result = new LinkedList<>();

        // 创建待排序元素
        List<Integer> elements = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));

        // 输出排列
        func(result, elements, 0);
    }

    /**
     * @param result
     * @param elements
     * @param index
     * @param <T>
     */
    public static <T> void func(List<T> result, List<T> elements, int index) {
        if (index == elements.size()) {
            printf(result);
            return;
        }

        for (int i = 0; i <= result.size(); i++) {

            // 依次加入到队列中去
            result.add(i, elements.get(index));

            // 递归到下一个数据
            func(result, elements, index + 1);

            // 删除这个元素
            result.remove(i);
        }
    }

    /**
     * 打印结果
     *
     * @param result
     * @param <T>
     */
    private static <T> void printf(List<T> result) {
        StringBuilder sb = new StringBuilder("[");
        for (T t : result) {
            sb.append(t.toString()).append(",");
        }
        sb.append("]");
        System.out.println(sb.toString());
    }
}
递归

简单的理解,递归就是函数调用自身的过程,从结构上来说,递归需要一个递归结束条件,该条件能够终止递归调用,其次对于递归,我的理解是一个有去有回的过程,它能够保存函数上一次调用的信息,当然本质上来说递归也是一种栈结构在方法调用上的实现。需要好好培养一下自己的递归思维,其实就是一种树形思维。

相关文章

  • 输出指定集合元素全排列

    算法分析 假设待全排列元素集合为[1],其中有一个元素1,那么全排列的所有序列为‘1’,如果此时集合为[1,2]也...

  • 子集、全排列、第k个排列

    子集输出 全排列输出 存在重复数字的全排列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大...

  • 输出数组的全排列

    思想: n 个元素数组全排列 = 第 1 个前缀 + 后 n - 1 个元素全排列 输出第 k 个元素之后的全排列...

  • 全排列

    现在给定n(n>=1)个元素组成的集合,输出该集合所有可能的排列,例如:集合{a,b,c}的所有可能排列{(a,b...

  • 全排列与n皇后的关系与递归实现

    全排列 对于全排列中的一般问题则是根据字典序从小到大输出指定数量或者序列的全排列。一个简单的问题则是:指定n个整数...

  • 全排列(next_permutation)算法

    功能: 给定一个具有n个元素的集合,要求输出这个集合中元素的全部可能的排列。 STL有一个函数next_permu...

  • Ionic中ng-repeat的应用

    ng-repeat指令用于循环输出指定次数的 HTML 元素。 集合必须是数组或对象。 所有的 HTML 元素都支...

  • 剑指 Offer II 083 没有重复元素集合的全排列

    剑指 Offer II 083. 没有重复元素集合的全排列[https://leetcode-cn.com/pro...

  • 线性代数笔记 (一)

    预备知识 全排列和对换 全排列 把 n 个不同的元素排成一列, 叫做这 n 个元素的全排列 (简称排列) .n 个...

  • 全排列

    两种方法:第一种方法:递归: 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递...

网友评论

      本文标题:输出指定集合元素全排列

      本文链接:https://www.haomeiwen.com/subject/jtmyzftx.html