这题N年前就知道了,但一直没仔细的想过。真是有愧于老师有亏于同学。。。
利用递归法来做这题关键下几点:
1.普通情况-取出序列中的一个数并且将剩下的序列全排列
2.特殊情况-序列中只剩一个数,则全排列就是其自身。将增个获得的序列输出。
3.在不止一个数的情况下,该位要分别交换剩下的数(例如:两个数A,B 则有两种情况,一个是AB 一个是BA)
下面是找的一个讲全排列和排列的JAVA实现。就直接贴出了。。。
---------------------------全排列
public class AllSort{
public static void main(String[] args) {
char buf[]={'a','b','c'};
perm(buf,0,buf.length-1);
}
public static void perm(char[] buf,int start,int end){
if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可(特殊情况)
for(int i=0;i<=end;i++){
System.out.print(buf[i]);
}
System.out.println();
}
else{//多个字母全排列(普遍情况)
for(int i=start;i<=end;i++){//(让指针start分别指向每一个数)
char temp=buf[start];//交换数组第一个元素与后续的元素
buf[start]=buf[i];
buf[i]=temp;
perm(buf,start+1,end);//后续元素递归全排列
temp=buf[start];//将交换后的数组还原
buf[start]=buf[i];
buf[i]=temp;
}
}
}
}
---------------------------排列
现在的问题是解决当n<m的时候,也就是一般的排列。分析这个排列的过程,首先是从m个物体中选取n,然后才是n的全排列。只不过当m=n的时候,我们省略了选取的过程。以1、2、3为例,当n=2时,P(3,2)=3*2=6,也就是12,21,13,31,23,32。那么算法如何实现呢?我是这么想的,首先你要知道这个m和n(废话!),然后构造一个长度为n的数组,这个数组是众多排列中的一个,然后不妨将长度为m的数组的前n位复制给这第一个数组,然后再循环后m-n位去循环替换这n位数组的每一位,这样就能实现选择的目的了。看代码:
import java.util.*;
public class AllSort{
static int count = 0;
static char[] buf = {'1', '2', '3', '4'};
static ArrayList<String> list = new ArrayList<String>();
public static void main(String[] args) {
select(buf, list, 3);
for(String str : list){
char[] temp = str.toCharArray();
perm(temp,0,temp.length-1);
}
System.out.println("In total: "+ count);
}
public static void select(char[] source, ArrayList<String> arrayList, int num){
int l = source.length;
char[] temp = new char[num];
System.arraycopy(source, 0, temp, 0, num);
arrayList.add(new String(temp));
for(int i=num; i<l; i++){
for (int j=0; j<num; j++){
char tempChar = temp[j];
temp[j] = source[i];
arrayList.add(new String(temp));
temp[j] = tempChar;
}
}
}
public static void perm(char[] buf, int start, int end){
if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
for(int i=0;i<=end;i++){
System.out.print(buf[i]);
}
count ++;
System.out.println();
}
else{//多个字母全排列
for(int i=start;i<=end;i++){
char temp=buf[start];//交换数组第一个元素与后续的元素
buf[start]=buf[i];
buf[i]=temp;
perm(buf,start+1,end);//后续元素递归全排列
temp=buf[start];//将交换后的数组还原
buf[start]=buf[i];
buf[i]=temp;
}
}
}
}
可以看出一个有意思的现象:数学上的定义,全排列是排列的特殊情况,然而在代码实现是,排列的实现方法是以全排列为基础的。
分享到:
相关推荐
下面我们将深入探讨如何使用Java实现字符数组的全排列。 首先,我们需要了解回溯法。回溯法是一种试探性的解决问题方法,它尝试逐步找到问题的所有解。当发现某一步无法继续找到有效解时,会退回一步,尝试其他的...
1、获取当前的一种排列,用start,end分别表示该排列的列头,列尾; 2、判断start是否和end相等,若相等,执行3,否则执行4; 3、将当前排列和已出现过的排列进行比较,判断当前排列是否已经出现过,若出现过,将其...
现在,我们来看如何用Java编写一个递归函数来实现全排列。首先定义一个方法,接受一个整型数组和一个整数N作为参数,表示当前处理到数组的第几个元素。初始调用时,数组中的所有元素都未被处理,因此N等于数组长度。...
标题中的“全排列的Hash函数(JAVA)”指的是在Java编程中使用Hash函数处理全排列问题。全排列是指从n个不同元素中取出m个元素,按照一定的顺序排列起来的所有可能的排列方式。在这个场景下,Hash函数通常用于快速查找...
"JAVA用递归实现全排列算法的示例代码" JAVA用递归实现全排列算法的示例代码主要介绍了JAVA用递归实现全排列算法的相关资料...JAVA用递归实现全排列算法的示例代码可以帮助我们更好地理解和学习全排列算法的实现细节。
在Java和C#这两个广泛使用的编程语言中,有许多不同的方法可以实现全排列。接下来,我们将深入探讨这两种语言中实现ABCD全排列的7种方法。 1. **回溯法**: 回溯法是一种典型的递归策略,适用于解决约束满足问题。...
全排列的非递归实现。 输入1,2,3,4 得到 [1 2 3 4]..........[4 3 2 1]所有24种排列
在Java中,我们可以使用递归的方式来实现全排列。递归的基本思路是,对于n个元素的全排列问题,我们先选择一个元素作为排列的第一个,然后对剩下的n-1个元素进行全排列。这样,每次递归调用都会解决规模更小的问题,...
这种方式避免了递归带来的栈空间消耗,但实现起来相对复杂,需要手动维护待处理的元素集合和当前排列状态。 总结,全排列算法主要通过递归或迭代实现,利用深度优先搜索或回溯策略。优化方法包括剪枝和记忆化,以...
java实现字符串的全排列可以使用递归思想和TreeSet来实现。通过将需要全排列的字符串分为两部分,并对第一个字符和后面的字符进行交换,可以生成所有可能的排列组合。 java代码的实现可以分为以下几个步骤: 1.将...
在本例中,我们将讨论如何使用递归方法实现全排列,以Java、C#、C++等主流编程语言为例。 全排列算法的核心思想是通过递归地交换元素来生成所有可能的序列。假设我们有一个包含n个不同元素的数组,全排列的数量是n...
Java全排列算法字典序下的下一个排列讲解 在计算机科学中,全排列算法是一种非常重要的算法,它可以将一个数组或集合中的所有元素排列成不同的顺序。今天,我们将讨论如何使用Java实现全排列算法,并且讨论字典序下...
根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的...以上就是关于如何使用回溯法输出自然数1到n的所有不重复排列(即n的全排列)的详细介绍及Java实现。希望对读者理解回溯法及其应用有所帮助。
本文将详细介绍Java实现abc字符串的排列组合,主要包括可重复排列、全排列和组合三个部分。 可重复排列 在Java中,可以使用递归来实现abc字符串的可重复排列。可重复排列是指从abc三个字符中选择字符,组成长度为3...
在本例中,我们关注的是非递归算法来实现全排列,这通常使用回溯法或者迭代的方式来完成,特别是在有新元素动态加入时,需要能够快速适应并重新生成全排列。 非递归算法的优点在于它可以避免深度过大的调用栈,从而...
总结来说,Java实现n位数字的全排列主要依靠递归算法,通过不断地尝试交换和回溯,确保所有可能的排列都能被找到。这种方法对于理解和学习递归以及回溯算法有着重要的实践意义。在实际应用中,这样的算法可能并不...
在Java中实现重复元素全排列,通常采用递归的方法。核心思想是通过交换元素的位置来生成不同的排列组合,并检查每次交换是否产生了一个新的、未被记录的排列。为了避免重复计算,可以使用一个辅助函数`Judge()`来...
在Java编程中,实现全排列通常涉及到递归或回溯等技术。本篇将详细介绍两种常用的Java方法来解决全排列问题,并探讨相关知识点。 ### 1. 递归法 递归法是一种自上而下解决问题的方法,它通过调用自身来解决子问题...
总之,字典排序求全排列的算法通过Java实现,结合了回溯法和深度优先搜索策略,遵循字典序规则生成所有可能的排列。理解并掌握这种算法有助于提升编程能力和解决复杂问题的能力。在实际应用中,这种算法可用于生成...
这个"实现了排列组合算法的类(JAVA).rar"文件提供了一种高效的JAVA实现,可以处理任意类型数组的排列和组合。下面将详细讨论排列组合的基本概念,以及在JAVA中实现这些算法的关键点。 排列是指从n个不同元素中...