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

输出全排列

    博客分类:
  • Java
阅读更多
给定一组对象,要求给出这些对象数据的全排列。 例子: 对象数据{A}, 全排列 [A] 对象数据 {A,B} 全排列 [AB] [BA] 对象数据 {A,B,C}全排列 [ABC][ACB][BAC][BCA][CAB][CBA] ... 依此类推 根据对象数据的个数,得到的全排列个数为 Num = N! (N为对象数据的个数)本例子采用递归方式来实现。本例子中没有考虑当出现相同数据时,产生相同的组合,如果需要保持每个组合的唯一性,可以将得到的组合放置到一个结果List中,然后通过contains(Object o)方法判断需要不需要加入到结果链表中就好了


代码:

import java.util.ArrayList;
import java.util.List;

/**
 * 题目: 给定一组对象,要求给出这些对象数据的全排列。 例子: 对象数据{A}, 全排列 [A] 对象数据 {A,B} 全排列 [AB] [BA] 对象数据
 * {A,B,C}全排列 [ABC][ACB][BAC][BCA][CAB][CBA] ... 依此类推 根据对象数据的个数, 得到的全排列个数为 Num =
 * N! (N为对象数据的个数)
 * 
 * 本例子采用递归方式来实现。
 * 本例子中没有考虑当出现相同数据时,产生相同的组合,
 * 如果需要保持每个组合的唯一性,可以将得到的组合放置到一个结果List中,
 * 然后通过contains(Object o)方法判断需要不需要加入到结果链表中就好了
 * 
 * @author Eric Wang
 * @version 1.0
 * 
 */
public class Permutation {

 private static final String EMPTY = "";

 // 通过列表来存放样本数据
 private static List<String> sampleData = new ArrayList<String>();
 static {
  // 初始化sampleData的值
  sampleData.add("A");
  sampleData.add("B");
  sampleData.add("C");
  sampleData.add("D");
  sampleData.add("E");
 }
 //统计个数
 private int currentCount = 1;

 /**
  * 
  * @param remainingData :
  *            剩余的需要递归的数据
  * @param currentData :
  *            目前得到的数据
  */
 public void getPermutation(List<String> remainingData, String currentData) {
  if (null == remainingData) {
   return;// 如果没有数据则直接返回,什么也不做
  }
  // 剩余的情况都是链表不为空的时候产生的
  if (1 == remainingData.size() || 2 == remainingData.size()) {
   printPermutation(remainingData, currentData);
  } else {
   for (int currentIndex = 0; currentIndex < remainingData.size(); currentIndex++) {
    List<String> tempList = new ArrayList<String>(remainingData);
    getPermutation(tempList, currentData
      + tempList.remove(currentIndex));
   }
  }
 }

 private String getCountInformation() {
  return new StringBuilder().append("第").append(currentCount++).append(
    "个:").toString();
 }

 /**
  * 当剩下小于等于两个数据时,输出符合条件的组合
  * 
  * @param remainingData
  * @param currentData
  */
 private void printPermutation(List<String> remainingData, String currentData) {
  if (1 == remainingData.size()) {
   System.out.println(new StringBuilder()
     .append(getCountInformation()).append(remainingData.get(0))
     .toString());
  } else if (2 == remainingData.size()) {
   System.out.println(new StringBuilder()
     .append(getCountInformation()).append(currentData).append(
       remainingData.get(0)).append(remainingData.get(1))
     .toString());
   System.out.println(new StringBuilder()
     .append(getCountInformation()).append(currentData).append(
       remainingData.get(1)).append(remainingData.get(0))
     .toString());
  }
 }

 public static void main(String[] args) {
  Permutation perm = new Permutation();
  perm.getPermutation(sampleData, EMPTY);
 }
}

输出结果情况

一个元素:

第1个:A


两个元素:

第1个:AB
第2个:BA


三个元素:

第1个:ABC
第2个:ACB
第3个:BAC
第4个:BCA
第5个:CAB
第6个:CBA


五个元素:

第1个:ABCDE
第2个:ABCED
第3个:ABDCE
第4个:ABDEC
第5个:ABECD
第6个:ABEDC
第7个:ACBDE
第8个:ACBED
第9个:ACDBE
第10个:ACDEB
第11个:ACEBD
第12个:ACEDB
第13个:ADBCE
第14个:ADBEC
第15个:ADCBE
第16个:ADCEB
第17个:ADEBC
第18个:ADECB
第19个:AEBCD
第20个:AEBDC
第21个:AECBD
第22个:AECDB
第23个:AEDBC
第24个:AEDCB
第25个:BACDE
第26个:BACED
第27个:BADCE
第28个:BADEC
第29个:BAECD
第30个:BAEDC
第31个:BCADE
第32个:BCAED
第33个:BCDAE
第34个:BCDEA
第35个:BCEAD
第36个:BCEDA
第37个:BDACE
第38个:BDAEC
第39个:BDCAE
第40个:BDCEA
第41个:BDEAC
第42个:BDECA
第43个:BEACD
第44个:BEADC
第45个:BECAD
第46个:BECDA
第47个:BEDAC
第48个:BEDCA
第49个:CABDE
第50个:CABED
第51个:CADBE
第52个:CADEB
第53个:CAEBD
第54个:CAEDB
第55个:CBADE
第56个:CBAED
第57个:CBDAE
第58个:CBDEA
第59个:CBEAD
第60个:CBEDA
第61个:CDABE
第62个:CDAEB
第63个:CDBAE
第64个:CDBEA
第65个:CDEAB
第66个:CDEBA
第67个:CEABD
第68个:CEADB
第69个:CEBAD
第70个:CEBDA
第71个:CEDAB
第72个:CEDBA
第73个:DABCE
第74个:DABEC
第75个:DACBE
第76个:DACEB
第77个:DAEBC
第78个:DAECB
第79个:DBACE
第80个:DBAEC
第81个:DBCAE
第82个:DBCEA
第83个:DBEAC
第84个:DBECA
第85个:DCABE
第86个:DCAEB
第87个:DCBAE
第88个:DCBEA
第89个:DCEAB
第90个:DCEBA
第91个:DEABC
第92个:DEACB
第93个:DEBAC
第94个:DEBCA
第95个:DECAB
第96个:DECBA
第97个:EABCD
第98个:EABDC
第99个:EACBD
第100个:EACDB
第101个:EADBC
第102个:EADCB
第103个:EBACD
第104个:EBADC
第105个:EBCAD
第106个:EBCDA
第107个:EBDAC
第108个:EBDCA
第109个:ECABD
第110个:ECADB
第111个:ECBAD
第112个:ECBDA
第113个:ECDAB
第114个:ECDBA
第115个:EDABC
第116个:EDACB
第117个:EDBAC
第118个:EDBCA
第119个:EDCAB
第120个:EDCBA

分享到:
评论

相关推荐

    n全排列输出

    输出n的全排列,有两种方法: 1. 采用递归插入的方法,如果知道n-1的全排列,n的全排列为将数值n插入的n-1的全排列之间的空隙和两头共n个位置。 2. 采用递归标记填充的方法,查看标记数组,将未标记的数值依次填充...

    编写程序输出前n个正整数的字典序全排列

    使用递归 :-------------输入给出正整数n,输出1到n的全排列,排列的输出顺序为字典序,每种排列占一行,数字间无空格,

    java递归实现N个数全排列输出

    用回溯法递归实现的输出N的全排列 如 123 132 。。。。

    N个数全排列c语言算法

    输入N,输出1-N全排列c语言算法,非递归算法................

    构造全排列问题

    ★问题描述: 如果一个长度为 n 序列包含 1 到n的每一个数字,那么我们说这个序列是一个长度...输出由空格隔开的满足要求的全排列,如果找不到满足的全排列则输出-1。 输入示例 输出示例 7 2 1 3 5 4 7 6 DUUDUD

    全排列-非递归算法

    全排列-非递归算法(适合动态的新元素加入重新输出全排列-本程序以1到6的数字输出为例)

    输出n个整数的全排列

    输出n个整数的全排列 C++程序 数据结构 实验一

    qpl.rar_CC_全排列_输入全排列

    实现字符的全排列,C++ 源代码,如 输入a,b,c,就会输出全排列:aa,bb,cc,ab,ac,bc

    输出有重复字符的全排列

    输出有重复字符的全排列,C++源码......

    数据结构习题集(有答案)

    有浙大的180多道习题适合基础复习 浙江大学远程教育学院 数据结构与算法练习题(客观题) 2007-2008学年秋学期

    输出n个数字的全排列(可重复)

    如:n=3 全排列的数字为 1 2 3 则输出 123 132 213 231 321 312 2、输入n和k(n》=k)求n个数字的(n,k)排列 如n=3,k=2 输入的三个数位1 2 3 则输出 12 13 21 23 31 32 3、输入n个数(有重复),求n个数字的...

    python回溯法实现数组全排列输出实例分析

    主要介绍了python回溯法实现数组全排列输出,以实例形式较为详细的分析了全排列的定义及回溯法的实现技巧,需要的朋友可以参考下

    全排列(阶乘)输出程序

    使用Visual C++ 6.0开发,程序可以实现n个数的全排列的输出,比如对于1,2,3的全排列的输出为:123,132,213,231,312,321 程序采用递归的方式实现

    回溯法 - 输出自然数1到n所有不重复的排列,即n的全排列

    输出自然数1到n的所有不重复的排列,即n的全排列。

    输出n个字符的全排列(没有重复字符)

    简单的实现,代码很短。...输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。

    全排列acc pascal程序加题解 全排列

    全排列acc pascal程序加题解 全排列 Time Limit:20000MS Memory Limit:65536K Total Submit:506 Accepted:218 Description 列出所有数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现得复...

    五个数的全排列

    用C语言实现5个数的排列组合,可以随机生成合格数或者手动输入

    CC++全排列..1--n的全排列以及字符串的全排列

    CC++全排列..1--n的全排列以及字符串的全排列

    全排列数生成

    输出各行遵循“小数优先”原则, 在各全排列中,较小的数尽量靠前输出。如果将每行上的输出看成一个数字,则所有输出构成升序数列。具体格式见输出样例。 【样例输入1】1 【样例输出1】1 【样例说明1】输入整数N=1,...

    C语言重复数全排列的代码

    生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于100,其中包含重复的字符。 【输出形式】 向标准输出印...

Global site tag (gtag.js) - Google Analytics