`
uncoseason
  • 浏览: 1946 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

数组所有排列的算法【基于盗梦空间】

阅读更多
    前些日子遇到一个算法面试题,需要求出一个数组的所有排列方式,个人所运用到的迭代递归算法与电影的“梦中梦”神似,有感而发。
    在每一次做梦之前,先预想好一个状态,在每一个梦做完之后,就需要恢复到我们做这一个梦之前的状态,因为在我们意识中的状态还是最初的状态,就像在递归之前改变数组的排列,递归完毕之后再恢复到这一次递归之前的状态。而我们并不知道我们的梦境处于第几层,于是我们需要一个标识来提供我们现在所处的位置。

	//一个泛型数组的空杯交换
	public static <T> void temp(T[] arr,int index1,int index2){
		T temp;
		temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}	
	/**
	 * 迭代递归
	 * @param <T> 泛型
	 * @param arr 泛型数组
	 * @param flag 标识符,用以标识从第几个元素开始迭代递归,元素从0开始
	 */
	public static <T> void sortAll(T[] arr,int flag){
		if(flag == arr.length){
			System.out.println(Arrays.toString(arr));
		}else{
			for (int i = flag; i < arr.length; i++) {
				temp(arr, i, flag);//迭代之前的空杯交换
				sortAll(arr, flag+1);//递归,将当前的标记自增
				temp(arr, i, flag);//迭代之后恢复原貌
			}
		}
	}
	//测试
	public static void main(String[] args) {
//		Integer[] arr = {1,2,2,3,4};
		Object[] arr = {'a','b','c'};
		sortAll(arr,0);
	}
}


分享到:
评论
5 楼 panpan123mail 2011-05-14  
嗯,很不错,有感而发的算法。。。都把生活融入代码中是多么惬意的事。。。O(∩_∩)O~
4 楼 lyl290932857 2011-05-10  
都是高手,发现我越来越菜啊
3 楼 Scooler 2011-04-30  
public static <T> void temp(T[] arr, int index1, int index2) {
		if(index1 == index2)
			return;
		T temp;
		temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}

稍微说点小意见.这里加一句在10位以上的能提高30%的效率。。
2 楼 kaitian521 2011-04-30  
STL next_permutation()
1 楼 uncoseason 2011-04-18  

在进行递归的前一行可以加上自己的过滤规则然后continue直接进入下一次的迭代。
例如:第一位不能为3,2的后一位不能是3
for (int i = flag; i < arr.length; i++) {
	temp(arr, i, flag);//迭代之前的空杯交换
           if(flag==0&&(Integer)arr[flag]==3)continue;//第一位不能为3
         //当前元素不是首位,2的后一位不能是3
         if(flag!=0)if((Integer)arr[flag]==3&&(Integer)arr[flag-1]==2)continue;
	sortAll(arr, flag+1);//递归,将当前的标记自增
	temp(arr, i, flag);//迭代之后恢复原貌
}

相关推荐

    PHP实现一维数组的组合算法

    PHP实现一维数组的组合算法,欢迎下载和评论。

    数组和常用算法

    数组和常用算法

    c# 中数组的算法 c# 中数组的算法,c# 中数组的算法

    4. 哈希表:虽然不是直接的数组算法,但`Dictionary, TValue&gt;`可以提供基于键值对的高效查找,其内部使用了哈希表。对于查找操作,哈希表通常比数组更快。 5. 动态数组:C#的`List&lt;T&gt;`类提供了动态扩展的数组功能,...

    从n个数组中取出所有排列组合(Java实现)

    总结来说,从n个数组中取出所有排列组合的Java实现涉及到递归算法、回溯法以及数据结构的操作。理解这些概念并能够熟练运用是成为一名优秀程序员的关键。通过这个例子,我们可以看到如何利用Java的灵活性和表达力来...

    数组与排序算法:从基础到进阶

    《数组与排序算法:从基础到进阶》是一本全面深入探讨数组基础知识和各种排序算法的实用指南。本书旨在为读者提供一个系统化的学习路径,从数组的基本概念开始,逐步深入到复杂的排序算法,帮助读者建立扎实的算法...

    使用数组实现BOOTH算法

    使用C语言数组实现BOOTH算法。算法思想来源于计算机组成原理。可以参考 唐朔飞.[计算机组成原理](第2版)

    C# 字节数组的模式匹配算法

    本篇文章将深入探讨如何使用C#来实现字节数组的模式匹配算法。 首先,我们要理解什么是模式匹配。模式匹配是指在一段文本(在本例中是字节数组)中查找一个特定的子序列(模式)。这种子序列可能是另一个字节数组或...

    数组倒序排列,数组倒置,C语言数组倒序算法详解.pdf

    将数组中的数逆序排放

    PHP实现多种类型的排列组合算法

    在编程领域,排列组合算法是解决许多问题的关键,特别是在数据处理、数据分析以及各种优化问题中。PHP作为一种流行的服务器端脚本语言,虽然不是为高性能计算而设计,但其丰富的库和简洁的语法使得实现这些算法变得...

    基于数组的SCL算法实现S7-1200_1500多通道模拟量批量处理的方法.docx

    因此,利用数组寻址和SCL算法实现多通道模拟量的批量处理成为了一种高效解决方案。本文将详细解析如何通过这种方式优化处理过程。 首先,我们需要创建一个新的数据类型。在西门子TIA博途中,打开PLC的数据类型编辑...

    数组排序算法

    排序数组是指将数组中的元素按特定规则(通常为升序或降序)重新排列的过程。在这个场景中,我们讨论的是如何对整型数组进行排序。 一、冒泡排序 冒泡排序是最简单的排序算法之一。它通过不断交换相邻的不正确顺序...

    【源代码】C++算法(五)一维数组去重(复杂度为n且不新开辟空间)

    在本篇【源代码】C++算法中,我们主要探讨的是如何在一维数组中去除重复元素,同时确保算法的时间复杂度为O(n),并且在整个处理过程中不额外开辟新的内存空间。这种问题在实际编程中非常常见,特别是在处理大量数据...

    C#二维数组双线性插值算法

    C#的二维数组双线性插值算法。 用于二维数组的双线性插值算法,可分别设置长度和宽度。

    数组排列.zip数组排列.zip

    在实际编程中,数组排列不仅是理论知识,还需要考虑性能优化,如选择合适的排序算法,考虑内存使用、时间复杂度和空间复杂度。此外,数组还可以与其他数据结构(如链表、队列、栈)结合使用,解决更复杂的编程问题。...

    后缀数组倍增算法实现

    后缀数组是一种在字符串处理中常用的工具,它用于存储一个字符串的所有后缀,并按照特定顺序排列。这个排列顺序可以是字典序或者其他自定义顺序。后缀数组在文本索引、模式匹配、最长公共前后缀查找等众多字符串问题...

    后缀数组创建算法的实现

    后缀数组是由一个文本的所有半无限串(即从文本任意位置开始直至文本结束的所有子串)按照字典顺序排列而成的数组。这种结构能够高效地支持多种复杂的查询操作,比如范围查找、模糊匹配等。 - **应用场景**: - **...

    整数数组的全排算法,很经典!!!

    数组的全排列是指将数组中的所有元素按照一定顺序排列的所有可能情况。在这个主题下,我们将深入探讨全排列的算法及其应用。 首先,我们要了解全排列的基本思想。对于一个包含n个不同元素的数组,其全排列数量为n的...

    易语言字典数组算法模块

    数组则是按照一定顺序排列的集合,易语言中的数组可存储任意类型的数据。因此,字典数组算法模块能够处理复杂的数据集合,并执行如插入、删除、查找等操作。 接下来,我们审视一下该模块中的“字典算法测试”子程序...

Global site tag (gtag.js) - Google Analytics