N个数全排列的非递归算法
- //N个数全排列的非递归算法
- #include"stdio.h"
- void swap(int &a, int &b)
- {
- int temp;
- temp = a;
- a = b;
- b = temp;
- }
- /*
- 根据当前的排列p,计算下一个排列。
- 原则是从1234–>4321,若p已经是最后一个排列,传回false,否则传回true。
- p是一个n维向量。
- */
- bool nextPermutation(int *p, int n)
- {
- int last=n-1;
- int i,j,k;
- //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。
- i=last;
- while(i>0&&p[i]<p[i-1])
- i--;
- //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。
- if(i==0)
- return false;
- //从后查到i,查找大于p[i - 1]的最小的数,记入k
- k=i;
- for(j=last;j>=i;j--)
- if(p[j]>p[i-1]&&p[j]<p[k])
- k =j;
- //交换p[k]和p[i - 1]
- swap(p[k],p[i-1]);
- //倒置p[last]到p[i]
- for (j =last,k =i;j>k;j--,k++)
- swap(p[j],p[k]);
- return true;
- }
- //显示一个排列
- void showPermutation(int *p, int n)
- {
- for(int i=0;i<n;i++)
- printf("%d ",p[i]);
- printf("\n");
- }
- int main(int argc, char *argv[])
- {
- int n;
- int *p;
- scanf("%d",&n);
- p = new int[n];
- for (int i = 0; i < n; i++)
- p[i] = i + 1;
- showPermutation(p, n);
- while(nextPermutation(p, n))
- {
- showPermutation(p, n);
- }
- //delete[] p;
- return 0;
- }
转载于:https://blog.51cto.com/shamrock/702551
N个数全排列的非递归算法相关推荐
- java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...
1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...
- 数据结构-二叉树(统计二叉树的结点个数递归与非递归算法)
文章目录 思路 Java 实现 思路 求结点个数为什么能用递归? 二叉树求结点个数,从根结点开始,求二叉树结点个数,对于根结点就是求左右子树所有结点数之和再加一,对于左右子树又是如此计算,这样的形式满 ...
- 康拓排列的自我总结--以及全排列的递归非递归算法
写了几个关于全排列的东西,然后就接触到了康拓排列.之前对于全排列的非递归算法耿耿于怀,一只不能找到好的方式.现在好了,有了康拓,什么都解决了. 递归求全排列 我们先来看一个简单的例子,就是如何递归的求 ...
- 全排列之递归与非递归算法实现总结
全排列之递归与非递归算法实现总结 递归实现 常见的是基于交换的,原理:从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}. ...
- 获取二叉树叶子节点个数的递归及非递归算法
递归算法 public static<T> int numOfLeavesInRecursion(BinaryTreeNode<T> root){ // 获取二叉树叶子节点的个 ...
- 算法学习之:全排列问题的递归算法(Perm)
[题目] 给出一个集合{1,2,3},求解该集合的全排列并打印. 全排列问题的递归算法(Perm) [算法思想] 设R={r1,r2,-,rn}是要进行排列的n个元素,Ri=R{ri}. 集合X中元素 ...
- 汉诺塔递归与非递归算法
问题描述: 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这 ...
- 斐波那契数与二分法的递归与非递归算法及其复杂度分析
1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...
- 基于非递归算法的汉诺塔游戏之Python实现
本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和理解.感谢国防科技大学刘万伟老师提供算法 ...
- 回溯法解决01背包-非递归算法-效率低
http://acm.zua.edu.cn/problem.php?cid=1025&pid=24 解题思路: 物体的个数为Num,背包的体积限制为Volum 物品的体积是v[1].v[2]. ...
最新文章
- JavaScript实现自动评论哔哩哔哩视频
- python virtualenv 如何更改mkvirtualenv默认新建虚拟环境的路径?WORKON_HOME
- 【Linux网络编程】网络协议入门
- Request.Form的用法
- 实现背景透明的方法,兼容ie6/7/8等浏览器
- BackgroundWorker的包装器
- java volatile关键字的理解
- 基于IDS模型设计的ICS
- newifi3刷机 php,newifi3breed解锁新路由3刷机免解锁刷breed详细方法老毛子Padavan固件...
- python长整型怎么用_长整型 python
- SSA静态单赋值概念理解
- 【总结】ElasticSearch创建索引失败,超过maximum shards
- MySql数据的完整性
- 2020李宏毅学习笔记——8. Convolution Netural Network
- 区块链——智能合约入门知识
- 日常瘦脸8个关键细节
- 疑因内部宫斗被离职,中兴 70 后程序员从公司坠楼 ​​​​
- excel导入基于Easypoi一对多导入(实现合并单元格)
- 一个想法照进现实-《IT连》创业项目:关于团队组建
- java的开发工具是什么_java都用什么开发工具
热门文章
- c++关于函数的参数传递全部知识点详解
- 【从线性回归到BP神经网络】第二部分:线性回归
- 【Codeforces Global Round 2】A-E题解 【Frets On Fire、Pavel and Triangles】
- 使用PS2EXE将PowerShell脚本编译为可执行程序
- 从0开始的Java复健笔记
- Swagger写的接口的输入参数是对象的处理方法!通俗易懂(图文并茂), 小白与大佬之间的对话!
- android 安装apk 代码,Android 8.0安装apk的实例代码
- 用R语言进行数据可视化的综合指南(一)
- 通过寄生组合式继承创建js的异常类
- 使用flask开发web应用