`
hwy1782
  • 浏览: 153376 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

全排序问题的递归算法

阅读更多

/** 
 * @author hwy1782@gmail.com 
 * @creation date 2010-7-7 下午10:06:24 
 *
 * 
 * 对于一个序列r={4,3,5…}求全排列?
        递归解法的思路:
 (1)对于一个序列R={4,3,5…},
    它其中的每一个数设为Ri,它的全排列我们设为perm(R).
 (2)对于R的全排列我们可以转化成几个小的问题:
        4开头,{3,5…}的全排列,
        3开头,{4,5…}的全排列,
        5开头,{4,3…}的全排列
        即
 	Perm(R)= {R1Perm(R-R1) , R2Perm(R-R2) , R3Perm(R-R3)......,RnPerm(R-Rn)}
	其核心思想就是:将每个元素放到n个元素组成的队列最前方,
	然后对剩余元素进行全排列,依次递归下去。
     
     比如:
   	a b c
	首先将a放到最前方(跟第一个元素交换),然后排列b c,然后将a放回本
        来位置,结果 a b c; a c b
	其次将b放到最前方(跟第一个元素交换),然后排列a c,然后将b放回
	结果 b a c; b c a
 * 
 */

public class ComputePermutation {
	
	public static void main(String[] args) {
		String str = "abc";
		char[] array = str.toCharArray();
		Perm(array, 0, array.length-1);
//		System.out.println(array.length);
	}

	public static void Perm(char[] array, int start, int end) {
		if(start == end){
			for(int i = 0; i <= end; i++)
				System.out.print(array[i]+" ");
			System.out.println();
		}else{
			for(int i = start; i <= end ; i++){
				exchange(array, start, i);
				Perm(array, start+1, end);
				exchange(array, start, i);
			}
		}
	}
	
	public static void exchange(char[] array, int start, int i){
		char temp = array[start];
		array[start] = array[i];
		array[i] = temp;
	}
}
 
分享到:
评论

相关推荐

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

    递归算法的核心在于它的自相似性,即一个问题的解可以通过解决规模更小的相同问题得到。在合并排序中,我们首先将数组分为两半,然后对每一半分别进行排序(这是递归调用),最后将两个有序的子数组合并成一个大的...

    全排序的递归与非递归算法C++

    全排序的递归与非递归算法C++实现 递归的思想如下:perm(p1,p2...pn)=p1perm(p2,p3...pn)+p2perm(p1,p3,p4...pn)+...+pnperm(p1,p2...pn-1)

    冒泡排序递归算法

    冒泡排序递归算法

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

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

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

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    acm递归算法总结竞赛

    在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...

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

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

    快速排序的非递归算法.doc

    非递归版本的快速排序则是不使用递归实现这一算法。 在给定的文档中,`quickpass` 函数实现了快速排序的主要逻辑,即“主元交换”(partition)过程。`quicksort` 函数则负责整体的控制,包括栈的管理以及主元交换...

    Hanoi塔问题的一种非递归算法

    ### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...

    Java数组排序总结(冒泡_选择_插入_希尔)__递归算法的复杂度

    本篇文章将深入探讨四种基本的排序算法:冒泡排序、选择排序、插入排序以及希尔排序,并结合递归算法的复杂度进行分析。这些排序算法在不同的场景下有不同的效率表现,理解它们的原理和复杂度可以帮助我们更好地选择...

    8645 归并排序 (非递归算法).txt

    标题与描述均提到了“8645 归并排序(非递归算法)”,这表明文件内容将围绕归并排序这一数据结构与算法领域的核心主题展开,且特别强调了非递归实现方式。归并排序是一种高效、稳定的排序算法,基于分治策略,其...

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

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

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

    递归算法则是一种解决问题的方法,它解决问题的每一个子问题都是原问题的缩小版,直到子问题简单到可以直接求解。在基数排序中,递归通常用于处理每一位的排序,将大数转换为小数的过程。 基数排序的基本步骤如下:...

    用c#语言编写的快速排序,冒泡排序,插入排序,选择排序,递归算法

    这里有四种常见的排序算法:快速排序、冒泡排序、插入排序和选择排序,以及一种常见的编程技术——递归算法。下面将对这些知识点进行详细解释。 **快速排序**: 快速排序是一种高效的排序算法,由C.A.R. Hoare在...

    堆排序的非递归算法分析与JAVA实现

    由于堆排序的非递归实现比递归实现更为复杂,需要我们手动控制循环的迭代次数和条件,因此在理解堆排序算法的逻辑时更为困难。不过,非递归实现能够减少函数调用的开销,提高算法的执行效率,对于理解堆排序的本质...

    递归算法习题

    递归算法是一种在解决问题时将问题拆分成更小的、相同或相似问题的方法。在编程中,递归是一种常见的技术,指的是函数直接或间接地调用自身来解决问题。递归算法的关键在于它必须能够将问题规模缩小,并且有一个明确...

    数据结构 归并排序(非递归算法)

    ### 数据结构:归并排序(非递归算法) #### 算法介绍 归并排序是一种高效的、基于比较的排序算法,它采用分治策略来对数组进行排序。归并排序可以递归地将数组分成更小的部分,然后将这些部分合并起来形成有序...

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

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

    合并排序递归算法

    合并排序的递归调用和合并排序的非递归调用的对比,可以让人感受到选择递归调用可以提高工作作业效率,只要得到递归公式和递归出口就可以了,问题解决起来会很省力

    插入排序递归非递归汇编写法

    "插入排序递归非递归汇编写法" 插入排序是常用的排序算法之一,它的时间复杂度为O(n^2),空间复杂度为O(1)。在本实验报告中,我们将使用MIPS汇编语言来实现插入排序,包括递归和非递归版本。 递归版本 在递归版本...

Global site tag (gtag.js) - Google Analytics