1. //N个数全排列的非递归算法
  2. #include"stdio.h"
  3. void swap(int &a, int &b)
  4. {
  5. int temp;
  6. temp = a;
  7. a = b;
  8. b = temp;
  9. }
  10. /*
  11. 根据当前的排列p,计算下一个排列。
  12. 原则是从1234–>4321,若p已经是最后一个排列,传回false,否则传回true。
  13. p是一个n维向量。
  14. */
  15. bool nextPermutation(int *p, int n)
  16. {
  17. int last=n-1;
  18. int i,j,k;
  19. //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。
  20. i=last;
  21. while(i>0&&p[i]<p[i-1])
  22. i--;
  23. //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。
  24. if(i==0)
  25. return false;
  26. //从后查到i,查找大于p[i - 1]的最小的数,记入k
  27. k=i;
  28. for(j=last;j>=i;j--)
  29. if(p[j]>p[i-1]&&p[j]<p[k])
  30. k =j;
  31. //交换p[k]和p[i - 1]
  32. swap(p[k],p[i-1]);
  33. //倒置p[last]到p[i]
  34. for (j =last,k =i;j>k;j--,k++)
  35. swap(p[j],p[k]);
  36. return true;
  37. }
  38. //显示一个排列
  39. void showPermutation(int *p, int n)
  40. {
  41. for(int i=0;i<n;i++)
  42. printf("%d ",p[i]);
  43. printf("\n");
  44. }
  45. int main(int argc, char *argv[])
  46. {
  47. int n;
  48. int *p;
  49. scanf("%d",&n);
  50. p = new int[n];
  51. for (int i = 0; i < n; i++)
  52. p[i] = i + 1;
  53. showPermutation(p, n);
  54. while(nextPermutation(p, n))
  55. {
  56. showPermutation(p, n);
  57. }
  58. //delete[] p;
  59. return 0;
  60. }

转载于:https://blog.51cto.com/shamrock/702551

N个数全排列的非递归算法相关推荐

  1. java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...

  2. 数据结构-二叉树(统计二叉树的结点个数递归与非递归算法)

    文章目录 思路 Java 实现 思路 求结点个数为什么能用递归? 二叉树求结点个数,从根结点开始,求二叉树结点个数,对于根结点就是求左右子树所有结点数之和再加一,对于左右子树又是如此计算,这样的形式满 ...

  3. 康拓排列的自我总结--以及全排列的递归非递归算法

    写了几个关于全排列的东西,然后就接触到了康拓排列.之前对于全排列的非递归算法耿耿于怀,一只不能找到好的方式.现在好了,有了康拓,什么都解决了. 递归求全排列 我们先来看一个简单的例子,就是如何递归的求 ...

  4. 全排列之递归与非递归算法实现总结

    全排列之递归与非递归算法实现总结 递归实现 常见的是基于交换的,原理:从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}. ...

  5. 获取二叉树叶子节点个数的递归及非递归算法

    递归算法 public static<T> int numOfLeavesInRecursion(BinaryTreeNode<T> root){ // 获取二叉树叶子节点的个 ...

  6. 算法学习之:全排列问题的递归算法(Perm)

    [题目] 给出一个集合{1,2,3},求解该集合的全排列并打印. 全排列问题的递归算法(Perm) [算法思想] 设R={r1,r2,-,rn}是要进行排列的n个元素,Ri=R{ri}. 集合X中元素 ...

  7. 汉诺塔递归与非递归算法

    问题描述: 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这 ...

  8. 斐波那契数与二分法的递归与非递归算法及其复杂度分析

    1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...

  9. 基于非递归算法的汉诺塔游戏之Python实现

    本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和理解.感谢国防科技大学刘万伟老师提供算法 ...

  10. 回溯法解决01背包-非递归算法-效率低

    http://acm.zua.edu.cn/problem.php?cid=1025&pid=24 解题思路: 物体的个数为Num,背包的体积限制为Volum 物品的体积是v[1].v[2]. ...

最新文章

  1. JavaScript实现自动评论哔哩哔哩视频
  2. python virtualenv 如何更改mkvirtualenv默认新建虚拟环境的路径?WORKON_HOME
  3. 【Linux网络编程】网络协议入门
  4. Request.Form的用法
  5. 实现背景透明的方法,兼容ie6/7/8等浏览器
  6. BackgroundWorker的包装器
  7. java volatile关键字的理解
  8. 基于IDS模型设计的ICS
  9. newifi3刷机 php,newifi3breed解锁新路由3刷机免解锁刷breed详细方法老毛子Padavan固件...
  10. python长整型怎么用_长整型 python
  11. SSA静态单赋值概念理解
  12. 【总结】ElasticSearch创建索引失败,超过maximum shards
  13. MySql数据的完整性
  14. 2020李宏毅学习笔记——8. Convolution Netural Network
  15. 区块链——智能合约入门知识
  16. 日常瘦脸8个关键细节
  17. 疑因内部宫斗被离职,中兴 70 后程序员从公司坠楼 ​​​​
  18. excel导入基于Easypoi一对多导入(实现合并单元格)
  19. 一个想法照进现实-《IT连》创业项目:关于团队组建
  20. java的开发工具是什么_java都用什么开发工具

热门文章

  1. c++关于函数的参数传递全部知识点详解
  2. 【从线性回归到BP神经网络】第二部分:线性回归
  3. 【Codeforces Global Round 2】A-E题解 【Frets On Fire、Pavel and Triangles】
  4. 使用PS2EXE将PowerShell脚本编译为可执行程序
  5. 从0开始的Java复健笔记
  6. Swagger写的接口的输入参数是对象的处理方法!通俗易懂(图文并茂), 小白与大佬之间的对话!
  7. android 安装apk 代码,Android 8.0安装apk的实例代码
  8. 用R语言进行数据可视化的综合指南(一)
  9. 通过寄生组合式继承创建js的异常类
  10. 使用flask开发web应用