`
ren78min
  • 浏览: 43448 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

递归实现排列算法

阅读更多
基本原理

N个元素排列,第1个位置有N种可能;第1个位置确定后,可将第2至第N个位置看作N-1个元素的排列;依此类推,可递归直至最后一个元素,为1个元素的排列。

实现代码
以下代码抄自http://blog.csdn.net/guo_rui22/article/details/2199732,略有改动,并添加注释。
import java.util.ArrayList;
/**
 * 全排列算法
 * 
 */
public class Arrange {

	private int total = 0;
	private ArrayList<String> arrangeList = new ArrayList<String>();

	public Arrange() {
	}

	/**
	 * 交换数组中两个元素的位置
	 * 
	 * @param list 待处理的元素数组
	 * @param m 要交换元素在数组中的位置
	 * @param n 要交换元素在数组中的位置
	 */
	private void swap(String list[], int m, int n) {
		String tmp = list[m];
		list[m] = list[n];
		list[n] = tmp;
	}

	/**
	 * 递归函数排列子数组(原始数组中位置从j到max)中的元素
	 * 
	 * @param list 原始数组
	 * @param j 子数组在原始数组中的位置
	 * @param max 原始数组长度
	 */
	public void perm(String list[], int j, int max) {
		// 递归结束,保存结果
		if (j > max) {
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i <= max; i++) {
				sb.append(list[i]).append(",");
			}
			if (sb.length()>0) {
				sb.setLength(sb.length()-1);
			}
			arrangeList.add(sb.toString());
			total++;
		} else {
			for (int i = j; i <= max; i++) {
				// 将子数组中元素i交换到当前子数组首位
				swap(list, j, i);
				// 排列首位以后的子数组
				perm(list, j + 1, max);
				// 将前面换到子数组首位的元素换回原位,以免影响其它子数组排列
				swap(list, j, i);
			}
		}
	}

	public int getTotal() {
		return total;
	}
	
	public ArrayList<String> getArrangeList() {
		return arrangeList;
	}

	public static void main(String args[]) {
		String list[] = { "1", "2", "3", "4", "5" };
		Arrange ts = new Arrange();
		ts.perm(list, 0, list.length-1);
		for (int i = 0; i < ts.getArrangeList().size(); i++) {
			System.out.println(ts.getArrangeList().get(i));
		}
		System.out.println("total:" + ts.total);
	}

}
分享到:
评论

相关推荐

    PHP递归实现排列算法

    PHP递归实现一位数组的排列算法。欢迎下载和评论。

    快速选择非递归与递归算法实现

    以上就是关于快速选择算法的非递归和递归实现的详细介绍。通过合理地选取基准和适当的数据结构,快速选择算法可以在大数据集上提供高效的k-th最小元素查找服务。在Java中的`QuickSelect.java`文件中,应该包含了这些...

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...

    合并排序递归和非递归算法

    合并排序是一种基于分治策略的高效排序算法,它将大问题分解为小问题来解决,然后将小问题的结果合并以得到最终的解决方案。这个过程既可以用递归方式实现,也可以用非递归方式实现。 首先,让我们来看看递归版本的...

    .net 递归算法 .net 递归算法.net 递归算法

    - **分治算法**:快速排序、归并排序等排序算法利用了递归。快速排序通过选取一个基准值,将数组分为小于和大于基准值的两部分,然后分别对这两部分进行递归排序。 - **动态规划**:一些优化问题,如斐波那契数列、...

    算法设计与分析实验_二分检索的递归实现

    快速排序是一种常用的内部排序算法,采用分治策略,以递归方式将大问题分解为小问题来解决。然而,这两个文件的具体内容未给出,因此无法详细讨论其实现细节。 总的来说,这个实验项目提供了理解和实践二分检索递归...

    利用递归算法实现的基数排序算法

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。...通过这个例子,可以深入学习到如何在实际编程中应用递归,并了解非比较型排序算法的工作原理。

    快速排序 --- 非递归实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R....总的来说,这个压缩包提供了一个非递归实现快速排序的完整示例,通过自定义栈的数据结构,实现了快速排序算法,适用于理解和学习快速排序的非递归实现方式。

    acm递归算法总结竞赛

    8. **递归与分治策略**:递归往往是分治算法的实现方式,如快速排序、归并排序等,通过将问题分解为独立的子问题来解决。 9. **递归的应用**:在ACM竞赛中,递归算法广泛应用于图论(如深度优先搜索)、树结构处理...

    汉诺塔递归与非递归两种算法的代码与结果对比

    非递归算法,也称为迭代算法,通过循环结构实现,不依赖于函数的嵌套调用。非递归算法通常需要额外的数据结构来跟踪当前的状态,例如盘子的位置和待移动的盘子。非递归算法的代码可能更复杂,但执行效率通常更高,...

    递归函数 递归排序法

    最著名的递归排序算法之一是快速排序(Quick Sort)。快速排序的核心思想是分治法:选取一个基准元素,将数组分为小于基准的元素和大于或等于基准的元素两部分,然后对这两部分再进行快速排序。这一过程可以通过递归...

    基于hadoop用并行递归实现排列组合运算

    本篇文章将介绍如何使用Hadoop框架来实现一个并行递归算法,用于生成给定长度的所有可能的排列组合。 问题的具体描述如下:给定一个整数`M`,程序需要输出由数字`1`、`2`、`3`、`4`组成的长度为`M`的所有排列组合。...

    用递归算法实现整数逆序

    递归算法广泛应用于各种计算机科学领域,如数据结构(树、图遍历)、数学(斐波那契数列)、排序算法(快速排序)等。 #### C++语言中的递归实现 在C++中实现递归非常直观,只需定义一个函数,在该函数中调用自身...

    合并排序(非递归算法)C语言

    合并排序非递归算法是学习计算机算法与实现的一种应用,可以巩固c语言所学的知识

    全排序算法c++递归实现

    ### 全排序算法C++递归实现解析 #### 一、引言 全排序(也称为全排列)是指对一个序列中的元素进行重新排列的所有可能的方式。例如,对于数字序列`1, 2, 3`,其所有可能的全排列为`123, 132, 213, 231, 312, 321`。...

    算法分析与设计实验-实验一 递归与分治算法设计

    合并排序是一种基于分治的排序算法。它将待排序序列分为两个子序列,分别进行排序,然后将两个有序子序列合并成一个完整的有序序列。在实验的`MERGE`函数中,通过递归地拆分序列,直到子序列只剩一个元素,然后逐步...

    c++合并排序算法递归与非递归方式

    c++实现的合并排序算法 用递归和非递归两种方式实现的

    Java排列组合算法分析和代码实现

    在实现排列算法时,通常使用回溯法,即从第一个位置开始,尝试所有可能的元素,然后递归地对剩余位置进行操作,直到所有位置都被填满或无法填充为止。在压缩包中的`Permutation.java`文件中,你可以找到这样的实现,...

Global site tag (gtag.js) - Google Analytics