转载自http://blog.csdn.net/sunyujia/article/details/4124011

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

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

/**
* <p>
* Title:全排列算法
*/
public class FullSort {
//将NUM设置为待排列数组的长度即实现全排列
private static int NUM = 3;

/**
* 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列
*/
private static void sort(List datas, List target) {
if (target.size() == NUM) {  //if{}实现输出
for (Object obj : target)
System.out.print(obj);
System.out.println();
return;
}
for (int i = 0; i < datas.size(); i++) {
List newDatas = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
sort(newDatas, newTarget);//递归调用
}
}

public static void main(String[] args) {
String[] datas = new String[] { "a", "b","c","d" };
sort(Arrays.asList(datas), new ArrayList());
}

}

结果:

abc
abd
acb
acd
adb
adc
bac
bad
bca
bcd
bda
bdc
cab
cad
cba
cbd
cda
cdb
dab
dac
dba
dbc
dca
dcb

文字分析:对ABCD中去三个数排列

abcd

(第一层)第一次调用sort(abcd,空值)函数时 target.size=0 进入for循环 此时 i=0 newTarget=a newData=bcd,调用sort(bcd,a);
(第二层)target.size=1 !=num 进入for循环 i=0 newTarget=ab newData=cd 调用sort(cd,ab)
(第三层) target.size=2 !=num 进入for循环 i=0 newTarget=abc newData=d 调用sort(d,abc)
(第四层) target.size=3 =num 输出 abc 在返回第三层

(第三层) 进入for循环 i=1 newTarget=abd newData=c 调用sort(abd,c)
(第四层) target.size=3 =num 输出 abd 在返回第三层
(第三层) for循环结束 返回第二层
(第二层) 进入for循环 i=1 ewTarget=ac newData=bd 调用sort(ac,bd)

等 ----

 图示:

最新文章

  1. java 对象序列化与反序列化
  2. 记录一次Tomcat内存泄露原因的追溯
  3. 泛函编程(5)-数据结构(Functional Data Structures)
  4. JSON生成c#类代码小工具(转)
  5. “:Choose a destination with a supported architecture in order to run on this device.”
  6. servlet 用法
  7. iOS项目冗余资源扫描脚本
  8. 1.ElasticSearch介绍及基本概念
  9. awk ‘! a[$0]++’ 去重
  10. mysql 字符集
  11. python_appium_模拟器启动app进行登录
  12. memoization提升递归效率
  13. STL容器之map
  14. js数组常用方法,含es5
  15. 解决Oracle死锁问题,及产生的原因
  16. /touch滑屏事件
  17. 在windows下解压缩rar文件
  18. C++_基础1-基本数据类型
  19. eclipse 解决编译出现GBK或UTF8 编码错误的方法
  20. 检测浏览器中是否有Flash插件

热门文章

  1. Beta阶段冲刺前准备
  2. (二)Jmeter各部件的作用
  3. API的HTTP Status Code
  4. python调用Sikuliapi
  5. 使用 Idea 打 scala程序的 jar 包 - 02
  6. Java override 和 overload 的区别和联系
  7. Java并发编程实战2-线程安全
  8. VMware 三种网络模式的区别
  9. 【刷题】BZOJ 5418 [Noi2018]屠龙勇士
  10. HEOI2015小L的白日梦