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-;
int i,j,k;
//从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。
i=last;
while(i>&&p[i]<p[i-])
i--;
//若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。
if(i==)
return false;
//从后查到i,查找大于p[i - 1]的最小的数,记入k
k=i;
for(j=last;j>=i;j--)
if(p[j]>p[i-]&&p[j]<p[k])
k =j;
//交换p[k]和p[i - 1]
swap(p[k],p[i-]);
//倒置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=;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 = ; i < n; i++)
p[i] = i + ;
showPermutation(p, n);
while(nextPermutation(p, n))
{
showPermutation(p, n);
}
//delete[] p;
return ;
} //本文出自 “阿凡达” 博客,请务必保留此出处
//http://shamrock.blog.51cto.com/2079212/702551
N个数全排列的非递归算法的更多相关文章
- 汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法
非递归算法: 根据圆盘的数量确定柱子的排放顺序: 若n为偶数,按顺时针方向依次摆放 A B C: 若n为奇数,按顺时针方向依次摆放 A C B. 然后进行如下操作: (1)按顺时针方向把圆盘1从现在的 ...
- 理解 Hanoi 汉诺塔非递归算法
汉诺塔介绍: 汉诺塔(港台:河内塔)是根据一个传说形成的数学问题: 最早发明这个问题的人是法国数学家爱德华·卢卡斯. 传说越南河内某间寺院有三根银棒,上串 64 个金盘.寺院里的僧侣依照一个古老的预言 ...
- N皇后问题 回溯非递归算法 C++实现2
运行结果 代码如下 #include <bits/stdc++.h> using namespace std; ; const char *LINE32 = "--------- ...
- C# 递归与非递归算法与数学公式
1.递归 递归:程序调用自身的编程技巧称为递归(recursion). 优点是:代码简洁,易于理解. 缺点是:运行效率较低. 递归思想:把问题分解成规模更小,但和原问题有着相同解法的问题. 1)下面是 ...
- 二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法
1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTree ...
- 【转】Java实现折半查找(二分查找)的递归和非递归算法
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/94051 Java二分 ...
- 前序 中序 后序 遍历 递归 非递归算法 java实现
前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...
- 【图的DFS】图的DFS非递归算法
在DFS的递归算法中,DFS框架如下: 1访问起点v0 2依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问. 3若该图为非连通图,则图中一定还存在未被访问的顶点 ...
- 打印N个数的循环算法和递归算法比较
1.循环算法: void PrintN_1(int N) { int i; ; i <= N; i++) printf("%d\n", i); return; } N可以为任 ...
随机推荐
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- 淘宝SKU组合查询算法实现
淘宝SKU组合查询算法实现 2015-11-14 16:18 1140人阅读 评论(0) 收藏 举报 分类: JavaScript(14) 目录(?)[+] 前端有多少事情可以做,能做到多 ...
- LeetCode:Jump Game I II
Jump Game Given an array of non-negative integers, you are initially positioned at the first index o ...
- SSRS开发的经验记录
虽然工作经验相当的长,但是之前在SSRS上还没有象今天这样的经验.这只是工作经验的一点记录. 1. 定义DataSet 定义DataSet的时后,可以采用Text的方式.用Text的方式可以用一段比较 ...
- 15.C#回顾及匿名类型(八章8.1-8.5)
今天的篇幅应该会很长,除了回顾前面学的一些,还有写一些关于匿名类型的相关知识,总体上对后续的学习很有帮助,学好了,后面更容易理解,不明白的,那就前面多翻几次,看多了总是会理解的.那么,进入正题吧. 自 ...
- Javascript基础系列之(三)数据类型 (布尔型 Boolean)
javascript同样有布尔型,可选值,true or fasle. var marr = true ; document.write(typeof(marr) + "<br> ...
- SQL中exists的使用方法
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False exists : 强调的是是否返回结果集,不要求知道返回什么, exists 与 in ...
- html 中添加背景音乐
Embed (一).基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等, Netscape及新版的IE 都支持.u ...
- openvpn的介绍和搭建过程
本文摘自:http://www.linuxidc.com/Linux/2012-01/51702.htm,在这只是为了做个笔记使用
- Owin中间件搭建OAuth2.0认证授权服务体会
继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...