`
uncoseason
  • 浏览: 1919 次
  • 性别: 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实现一维数组的组合算法,欢迎下载和评论。

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

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

    使用数组实现BOOTH算法

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

    数组排序算法

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

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

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

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

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

    后缀数组倍增算法实现

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

    后缀数组创建算法的实现

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

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

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

    易语言数组排序算法集合

    快速排序是基于分治策略的排序算法,通过选择一个基准元素,将数组分为小于和大于基准的两部分,然后递归地对这两部分进行快速排序。 这些排序算法各有优缺点,适用于不同的数据场景。易语言数组排序算法集合中的...

    4-14_lv一维数组中所有元素之和_

    计算一维数组中所有元素之和的基本算法非常简单:初始化一个变量(初始值通常为零),然后遍历数组中的每一个元素,将当前元素的值加到变量上。当遍历完整个数组后,变量的值即为所有元素的总和。 三、LV中的数组...

    Java实现字符数组全排列的方法

    全排列是指从给定的字符数组中,按照一定的顺序生成所有可能的排列组合。这个问题通常使用回溯法来解决,因为它能够有效地避免重复的排列。下面我们将深入探讨如何使用Java实现字符数组的全排列。 首先,我们需要...

    DES加密算法 C实现 二维数组

    DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于Feistel网络结构,具有较强的加密能力。在C语言中实现DES加密算法通常需要理解其内部的工作原理,并且能够用数组来模拟位操作。本篇文章将深入...

    matlab开发-多维数组的合并排序

    本主题将深入探讨如何使用合并排序(Merge Sort)这一高效稳定的排序算法来对MATLAB中的多维数组进行排序。合并排序是一种分治策略,其基本思想是将大问题分解成小问题来解决,然后将小问题的解合并成原问题的解。 ...

    VBA示例之 数组按升序排列

    本示例将深入探讨如何使用VBA实现数组的升序排列,这对于初学者来说是一个很好的学习起点。在此,我们将详细讲解VBA中的数组概念、排序算法以及如何将这个过程应用于VB6.0环境。 首先,理解VBA中的数组是非常重要的...

    实验七 数组—排序算法和矩阵乘法.doc

    实验七的主题聚焦于数组,具体涉及排序算法(选择法和冒泡法)以及矩阵乘法。这些是计算机科学基础中的核心概念,特别是在数据处理和算法设计方面。 **排序算法** 1. **冒泡排序**:冒泡排序是一种简单的排序算法...

    C语言中数组的排序算法.rar

    在`排序算法-冒泡法.c`文件中,循环遍历数组,每轮比较相邻元素并根据需要交换,多次迭代直至无交换发生,即表明数组已排序。 3. **交换法排序(Exchange Sort)** 交换法实际上就是快速排序的一种变体,主要利用了...

Global site tag (gtag.js) - Google Analytics