`

递归实现显示集合中元素的所有排列

阅读更多
有一个比较有趣的问题如下:
假如有五个数字,12345,请列出所有的排列,结果不能重复.

分析:
对于此类排列问题,优先想到递归的方式去处理,那么把问题转换成算法呢?
首先,假如只有三个数字123
那么排列如下
1  -> 23
    -> 32
2  -> 13
    -> 31
3  -> 12
    -> 21
很明显,在最后两个数字时,只需要将它们颠倒一下即可,然后递归结束。刚开始进入递归算法时,列出所有的第一个数字,然后在循环里去调用递归。

实现:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


public class ArrangeNumber {
	// Added this set for avoiding repetition result;
	private static Set<String> set = new HashSet<String>();
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(2);
		list.add(4);
		arrangeNumbers("", list);
	}
	
	public static void arrangeNumbers(String header, List<Integer> list) {
		// If there are only two elements, display them positive order and negative order, the Recursion method ended
		if(list.size() == 2) {
			if(!set.contains(header + list.get(0) + list.get(1))) {
				System.out.println(header + list.get(0) + list.get(1));
				set.add(header + list.get(0) + list.get(1));
			}
			
			if(!set.contains(header + list.get(1) + list.get(0))) {
				System.out.println(header + list.get(1) + list.get(0));
				set.add(header + list.get(1) + list.get(0));
			}
			
			return;
		}
		
		// Main Recursion logic
		for(int i = 0; i < list.size(); i ++) {
			List<Integer> templist = new ArrayList<Integer>();
			String tempheader = header + list.get(i);
			for(int j = 0; j < list.size(); j ++) {
				if(i != j) {
					templist.add(list.get(j));
				}
			}
			arrangeNumbers(tempheader, templist);
		}
	}
}



时间复杂度:
首先递归中有双重循环,那么复杂度是N^2.
在递归中,假如3个数字是3次,4个数字是4*3次,可见递归的复杂度是N!
根据算法时间复杂度原则,只保留最高阶,所以该算法的时间复杂度是O(N!)

算法分析中常见的复杂度
O(1)  < O(lgn)  <  O(n) <  O(nlgn)  < O(n2)< O(n3)<O(2n)  < O(n!) < O(nn)
分享到:
评论

相关推荐

    全排列——递归排序和字典序列

    从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。 (2)字典序排列 把升序的排列(当然,也可以实现为降序)作为当前排列开始,然后依次...

    有重复元素的排列问题

    Description 设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法,列出R的所有不同排列。 即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。 ...

    8594 有重复元素的排列问题

    课本上有“递归”实现无重复元素全排列的源程序。 稍加修改即可满足此题要求。 在递归产生全排列的那段程序开始之前, 加一个判断:判断第i个元素是否在list[k,i-1]中出现过。 Permpp(char list[], int k, int m) {...

    python递归全排列实现方法

    排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列; 全排列:当n==m时,称为全排列; 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 递归思想: ...

    数据结构实验

    (2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列。 (3)假设两个顺序线性表La和Lb分别表示两个集合A和B,利用 union_Sq操作实现A=A∪B。 四、思考与提高 假设两个顺序线性表La和Lb分别表示两个集合...

    Matlab实现全排列.doc

    集合R中元素的全排列记为perm(R),(ri)perm(R)表示在全排列perm(R)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳递归定义如下:当n==1时,perm(R)=(r),其中r是集合R中唯一的元素;当n&gt;1时,perm(R)由...

    C#算法之全排列递归算法实例讲解

    排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列; 全排列:当n==m时,称为全排列; 比如:集合{ 1,2,3}的全排列为: 代码如下: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } ...

    深入全排列算法及其实现方法

    一、递归实现例如,如果集合是{a,b,c},那么这个集合中元素的所有排列是{(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)},显然,给定n个元素共有n!种不同的排列,如果给定集合是{a,b,c,d},可以用下面给出的简单...

    递归算法.zip

    算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...

    全排序问题分析及程序

    集合X中元素的全排列记为perm(X); 设(ri)perm(X)表示每一个全排列前加上前缀 ri得到的排列. 当n=1时,perm(R)=(r) 其中r是唯一的元素,这个就是出口条件. 当n&gt;1时,perm(R)由 (r1)perm(R1),(r2)perm(R2),...(rn)perm(Rn...

    LeetCode解题总结

    10.3 集合元素之和 10.3.1 元素可以重复 10.3.2 元素不可重复 10.3.3 给定元素数目和元素范围 10.4 正确的括号对 10.5 解数独 10.6 单词搜索 10.7 小结 10.7.1 适用场景 10.7.2 思考步骤 10.7.3 代码模板 10.7.4 ...

    重叠子问题的递归最优解.zip

    算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...

    C语言程序源代码(大集合).rar

    C语言程序源代码(大集合).rar 实际只有139个,其余部分丢失! 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007 自增/自...

    数据结构:八大数据结构分析.pdf

    数据结构:⼋⼤数据结构分析 数据结构分类 数据结构是指相互之间存在着⼀种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常⽤的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所...

    220个C语言程序源代码集合.zip

    013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割...

    使用C语言解决字符串全排列问题

    输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例042 去掉字符串中的所有空格 54 实例043 从字符串中分离文件路径、文件名及 扩展名 55 实例044 获取字符串中汉字的个数 57 实例045 批量替换某一类字符串 58 实例046 对字符串进行加密与解密 59 3.3 常用数字...

Global site tag (gtag.js) - Google Analytics