http://blog.csdn.net/xiazdong/article/details/7986015

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;

全排列:当n==m时,称为全排列;

比如:集合{ 1,2,3}的全排列为:

{ 1 2 3}

{ 1 3 2 }

{ 2 1 3 }

{ 2 3 1 }

{ 3 2 1 }

{ 3 1 2 }

方法一:

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致;

算法思路:

(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);

(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;

(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

[java] view plain copy

  1. public class Test {

  2. public static int arr[] = new int[]{1,2,3};

  3. public static void main(String[] args) {

  4. perm(arr,0,arr.length-1);

  5. }

  6. private static void swap(int i1, int i2) {

  7. int temp = arr[i2];

  8. arr[i2] = arr[i1];

  9. arr[i1] = temp;

  10. }

  11. /**

  12. * 对arr数组中的begin~end进行全排列

  13. *

  14. * 比如:

  15. *  arr = {1,2,3}

  16. *  第一步:执行 perm({1,2,3},0,2),begin=0,end=2;

  17. *      j=0,因此执行perm({1,2,3},1,2),begin=1,end=2;

  18. *          j=1,swap(arr,0,0)-->arr={1,2,3},  perm({1,2,3},2,2),begin=2,end=2;

  19. *              因为begin==end,因此输出数组{1,2,3}

  20. *          swap(arr,1,1) --> arr={1,2,3};

  21. *          j=2,swap(arr,1,2)-->arr={1,3,2},  perm({1,3,2},2,2),begin=2,end=2;

  22. *              因为begin==end,因此输出数组{1,3,2}

  23. *          swap(arr,2,1) --> arr={1,2,3};

  24. *      j=1,swap(arr,0,1) --> arr={2,1,3},     perm({2,1,3},1,2),begin=1,end=2;

  25. *          j=1,swap(arr,1,1)-->arr={2,1,3}   perm({2,1,3},2,2),begin=2,end=2;

  26. *              因为begin==end,因此输出数组{2,1,3}

  27. *          swap(arr,1,1)--> arr={2,1,3};

  28. *          j=2,swap(arr,1,2)后 arr={2,3,1},并执行perm({2,3,1},2,2),begin=2,end=2;

  29. *              因为begin==end,因此输出数组{2,3,1}

  30. *          swap(arr,2,1) --> arr={2,1,3};

  31. *      swap(arr,1,0)  --> arr={1,2,3}

  32. *      j=2,swap(arr,2,0) --> arr={3,2,1},执行perm({3,2,1},1,2),begin=1,end=2;

  33. *          j=1,swap(arr,1,1) --> arr={3,2,1} , perm({3,2,1},2,2),begin=2,end=2;

  34. *              因为begin==end,因此输出数组{3,2,1}

  35. *          swap(arr,1,1) --> arr={3,2,1};

  36. *          j=2,swap(arr,2,1) --> arr={3,1,2},并执行perm({2,3,1},2,2),begin=2,end=2;

  37. *              因为begin==end,因此输出数组{3,1,2}

  38. *          swap(arr,2,1) --> arr={3,2,1};

  39. *      swap(arr,0,2) --> arr={1,2,3}

  40. *

  41. * @param arr

  42. * @param begin

  43. * @param end

  44. */

  45. public static void perm(int arr[], int begin,int end) {

  46. if(end==begin){         //一到递归的出口就输出数组,此数组为全排列

  47. for(int i=0;i<=end;i++){

  48. System.out.print(arr[i]+" ");

  49. }

  50. System.out.println();

  51. return;

  52. }

  53. else{

  54. for(int j=begin;j<=end;j++){

  55. swap(begin,j);      //for循环将begin~end中的每个数放到begin位置中去

  56. perm(arr,begin+1,end);  //假设begin位置确定,那么对begin+1~end中的数继续递归

  57. swap(begin,j);      //换过去后再还原

  58. }

  59. }

  60. }

  61. }

方法二:

[java] view plain copy

  1. public class Test2 {

  2. public static int arr[] = new int[]{0,0,0};

  3. public static void main(String[] args) {

  4. perm(3);

  5. }

  6. /**

  7. * 数组变化过程:

  8. * 3 0 0

  9. * 3 2 0

  10. * 3 2 1

  11. * 3 2 0

  12. * 3 0 0

  13. * 3 0 2

  14. * 3 1 2

  15. * 3 0 2

  16. * 3 0 0

  17. * 0 0 0

  18. * 0 3 0

  19. * 2 3 0

  20. * 2 3 1

  21. * 2 3 0

  22. * 0 3 0

  23. * 0 3 2

  24. * 1 3 2

  25. * 0 3 2

  26. * 0 3 0

  27. * 0 0 0

  28. * 0 0 3

  29. * 2 0 3

  30. * 2 1 3

  31. * 2 0 3

  32. * 0 0 3

  33. * 0 2 3

  34. * 1 2 3

  35. * 0 2 3

  36. * 0 0 3

  37. * 0 0 0

  38. * @param m

  39. */

  40. private static void perm(int m) {

  41. if(m==0){

  42. for(int i=0;i<arr.length;i++){

  43. System.out.print(arr[i]+" ");

  44. }

  45. System.out.println();

  46. return;

  47. }

  48. else{

  49. for(int i=0;i<arr.length;i++){

  50. if(arr[i]==0){

  51. arr[i] = m;

  52. perm(m-1);

  53. arr[i] = 0;

  54. }

  55. }

  56. }

  57. }

  58. }

参考文献:

1.全排列的递归算法实现   李盘荣

2.全排列递归算法在算法教学中的重要性  吴素萍

3.排序算法与全排列生成算法研究 陈卫东, 鲍苏苏

论文下载地址:http://yunpan.cn/lk/05qsom5mle

Reference:

递归解决全排列生成算法_xiazdong-CSDN博客_全排列递归

递归方式-全排列生成算法相关推荐

  1. c语言栈的实现以及操作_python模拟栈的操作实现非递归方式的快速排序算法

    本文首发地址: https://yishuihancheng.blog.csdn.net/article/details/76185032 欢迎关注我的博客[Together_CZ],我是沂水寒城! ...

  2. 随机迷宫 c语言思路,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  3. c语言随机迷宫生成方法,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  4. 随机迷宫c语言实验报告,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  5. c语言生成迷宫算法,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  6. 全排列的生成算法:字典序法

    全排列的生成算法:字典序法    全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.     字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...

  7. C语言递归方式实现冒泡排序(bubble排序)算法(附完整源码)

    递归方式实现冒泡排序算法 递归方式实现冒泡排序算法的完整源码(定义,实现,main函数测试) 递归方式实现冒泡排序算法的完整源码(定义,实现,main函数测试) #include <assert ...

  8. 组合数学4-全排列生成算法

    文章目录 全排列生成算法 一 钟声里的全排列 **思考**:生成算法 二 字典序法 1.递归 2.字典序法 例1:生成字母abc的全排列 例2:生成123的全排列 例3:生成839647521的全排列 ...

  9. python递归方式和普通方式实现输出和查询斐波那契数列

    斐波那契数列 斐波那契数列(Fibonacci sequence),是从1,1开始,后面每一项等于前面两项之和. 如果为了方便可以用递归实现,要是为了性能更好就用循环. 递归方式实现生成前30个斐波那 ...

最新文章

  1. activiti5/6 系列之--BpmnModel使用
  2. asmx 接受 ajax post,jQuery ajax调用web服务(asmx)触发认证弹出框
  3. 《数据库系统实训》实验报告——单表查询
  4. vueJs开发音乐播放器第二篇(点击歌单跳出详情页)
  5. xcode 修改 infodictionary_安卓系统修改复位键生效时间
  6. 【POJ - 2378】Tree Cutting(树形dp,树的重心变形)
  7. Spring Boot学习笔记:Spring Boot的Web功能
  8. 【记录贴】cs231n课程作业一遇到问题总结
  9. IE6layout元素自动包含浮动元素
  10. 关于Servlet报错:405 HTTP method GET is not supported by this URL问题解决方法
  11. arcgis热点分析_地理信息系统导论学习笔记(11)——矢量数据分析
  12. JAVA后端开发的一些工作经验
  13. cad怎样弄出放线的坐标_不知道如何定位放线?今天教大家一个快速准确放线方法(含实例)...
  14. 第15课:RDD创建内幕彻底解密
  15. thinkpad重装系统步骤
  16. 云计算的二十个基本定义 不可不知!
  17. 【编程书库】入门+进阶C语言,这几本就够了!
  18. Wix 安装部署教程(十三) -- 多语言安装包
  19. ​听六小桨讲AI | 第7期:3D卷积和分组卷积
  20. java学习常用网站推荐

热门文章

  1. 动态规划--背包问题
  2. C# Winform中慎用Application.DoEvents
  3. 如何理解java采用Unicode编码
  4. mysql默认安装目录说明
  5. 一步一步教你抓数据——用.net精确提取网站数据的通用方法 [转]
  6. vue8种组件通信方式
  7. 两列布局左边定宽,右边自适应
  8. vue日期格式化实例
  9. ES6公用花瓣飘落插件的封装及使用,支持npm安装
  10. java设计模式之设计原则③单一职责原则