//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个数全排列的非递归算法的更多相关文章

  1. 汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法

    非递归算法: 根据圆盘的数量确定柱子的排放顺序: 若n为偶数,按顺时针方向依次摆放 A B C: 若n为奇数,按顺时针方向依次摆放 A C B. 然后进行如下操作: (1)按顺时针方向把圆盘1从现在的 ...

  2. 理解 Hanoi 汉诺塔非递归算法

    汉诺塔介绍: 汉诺塔(港台:河内塔)是根据一个传说形成的数学问题: 最早发明这个问题的人是法国数学家爱德华·卢卡斯. 传说越南河内某间寺院有三根银棒,上串 64 个金盘.寺院里的僧侣依照一个古老的预言 ...

  3. N皇后问题 回溯非递归算法 C++实现2

    运行结果 代码如下 #include <bits/stdc++.h> using namespace std; ; const char *LINE32 = "--------- ...

  4. C# 递归与非递归算法与数学公式

    1.递归 递归:程序调用自身的编程技巧称为递归(recursion). 优点是:代码简洁,易于理解. 缺点是:运行效率较低. 递归思想:把问题分解成规模更小,但和原问题有着相同解法的问题. 1)下面是 ...

  5. 二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法

    1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTree ...

  6. 【转】Java实现折半查找(二分查找)的递归和非递归算法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/94051 Java二分 ...

  7. 前序 中序 后序 遍历 递归 非递归算法 java实现

    前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...

  8. 【图的DFS】图的DFS非递归算法

    在DFS的递归算法中,DFS框架如下: 1访问起点v0 2依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问. 3若该图为非连通图,则图中一定还存在未被访问的顶点 ...

  9. 打印N个数的循环算法和递归算法比较

    1.循环算法: void PrintN_1(int N) { int i; ; i <= N; i++) printf("%d\n", i); return; } N可以为任 ...

随机推荐

  1. DWZ(JUI)的lookupGroup增加回调函数

    DWZ 是一个很好的富客户端框架 lookupGroup也是一个必用到的东东,但没有回调函数,后期处理相当的不便. 修改其dwz.database.js 增加几行,就能实行一个很好的回调. 使用就方便 ...

  2. listview的头布局把我的ACTION_DOWN事件给吃了.....

    因为头布局的viewpager自己处理点击事件 public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) ...

  3. 开发机上绕过Chrome同源策略的办法

    开发机上绕过Chrome同源策略的办法 标签: Chrome同源策略跨域 2013-08-21 18:33 6071人阅读 评论(0) 收藏 举报  分类: Chrome扩展(1)  版权声明:本文为 ...

  4. linux实践——内核编程 基础模块

    一.内核模块的概念 Linux模块(module)是一些可以作为独立程序来编译的函数和数据类型的集合.内核模块给我们带来的便利是模块本身并不被编译进内核文件,可在内核运行期间动态的安装或卸载.因为如果 ...

  5. Linux(10.18-10.25)学习笔记

    一.学习目标 1. 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 2. 理解局部性原理 3. 理解缓存思想 4. 理解局部性原理和缓存思想在存储层次结构中的应用 5. 高速缓存的原理和应用 ...

  6. IOS开发之—— Core Foundation对象与OC对象相对转换的问题

    对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...

  7. iOS开发之—— XCODE真机调试设备连接一直忙碌如何处理!(真机调试各种错误提示解决)

    真机调试,想连接真机调试代码可是连上设备后就一直转圈, 在Divice里面一直提示“iphone名称” is busy: Processing symbol files Xcode will cont ...

  8. vim环境设置和自动对齐

    只要在 /etc/vimrc中加上这两句就行了set autoindentset smartindent------------------------------------------------ ...

  9. mysql使用基础 sql语句与数据完整性(二)

    二.DML:Data Manipulation Language 数据操作语言 作用:操作表中的数据的. 关键:INSERT UPDATE DELETE 注意:日期或字符串.字符要使用单引号引起来. ...

  10. 解决SourceGrid在某些系统上无法用鼠标滚轮滚动的问题

    4.40版源码,找到SourceGrid/SourceGrid/Common/CustomScrollControl.cs 这个文件 定位 CustomScrollWheel() 方法,把if条件判断 ...