`
yuyeyi
  • 浏览: 36676 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

全排列

阅读更多
算法1 

一个经典的全排列算法zz2007-06-19 08:39设想有 n 个数字, 先取第一个数字. 再取第二个数字, 第二个数可以放在第一个数的左或右面, 就是有 0, 1 两个选择. 再取第三个数, 放到前面选好的两个数字中, 可以放在最左, 中间, 最右, 就是有 0, 1, 2 三个选择. 嗯, 很自然吗. 忽然你想到了二进位, 八进位那些数系转换关系。可以设计这样一个数, ...xyz, 其中个位数 z 是二进位的, 也就是放第二个数的两个位置; 十位数 y 是三进位的, 代表放第三个数字的三个位子, 然后百位数是四进位, 千位数是五进位的, 依以类推." 没错, 这样设计的话, 如果 0 表示放於最左面的话, 则 "2021" 这个数就代表了排列五个元素 (abcde), 取一个 a, 然后第二个 b 放在 a 的右面成 ab, 取 c 放到最右面成为 abc, 取 d 放到最左面成 dabc; 最后 e 放到中间去成为 daebc. 至於 "2021" 这个特别的设计的数可以用2*5+ 0*4 + 2*3 + 1*2 这样的计算来映对到自然数的数列上去。

如求 4 个数的 4! = 24 个排列, 第 18 个排列可以这样求得, 18 除 2, 余数是 0, 所以第二个数放在第一个数的左面; 然后商 9 再除 3, 余数 0, 所以第三个数於在头两个数的最左; 最后 3 除以 4, 余数是 3, 因此第四个数要放在前三个数的第 4 个空位, 也就是最右面。 

 

算法 2 

/*******************************/
 *定义循环左移函数
 *将str[0]依次后移到str[m]
 *******************************/
void chang(char str[],int m)  
 {
  int i,j;
  char temp=str[0];
  for (i=0;i<m;i++) str[i]=str[i+1];
  str[i]=temp;
 }
/*******************************/
 *从str[m]开始进行全排列
 *n 是要全排列的个数,在这里仅作为参数,
 *值不发生变化。“ABCD”中 n === 4
 *******************************/
void pai(char str[],int m,int n) /*定义全排列函数*/
{
 int k;
 void chang(char str[],int m);
 if (m<n)        /* 定 义 递 归 调 用 出 口  */
  {
   for (k=0;k<=m;k++)
    {
     pai(str,m+1,n);  /*递归调用*/
     chang(str,m); /*调用左移函数*/
    }
  }
 else printf("%s ",str); 
}



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lotus_zal/archive/2008/03/20/2200997.aspx

分享到:
评论

相关推荐

    全排列acc pascal程序加题解 全排列

    全排列acc pascal程序加题解 全排列 Time Limit:20000MS Memory Limit:65536K Total Submit:506 Accepted:218 Description 列出所有数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现得复...

    全排列代码,C语言代码,用来解决全排列问题

    全排列代码,C语言代码,用来解决全排列问题,csc 认证

    全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为

    全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为 例说明如何编写全排列的递归算法。 1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列...

    使用swap求解不重复字符串的全排列

    123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来...

    全排列算法C语言超简洁

    自己写的基于字符的全排列算法,代码简洁,高效,7位数的全排列都是秒排!用到了广度优先排列,深度优先搜索和几个递归,唯一没完成的是退出时释放内存,呵呵,破解密码时超有用的哟,,

    全排列——递归排序和字典序列

    全排列算法有两个比较常见的实现:递归排列和字典序排列。 (1)递归实现 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。 (2)字典...

    计算方法习题 适合学生习题参考 设R=(1, 2, .., n),计算R的全排列。

    /*设R=(1, 2, .., n),计算R的全排列。 分治法求解全排列的算法思想: 设R=(1, 2, .., n)的全排列为P(R), 若R=(),则P()=(); 否则,P(R)={(1)P(2, 3, .., n),(2)P(1, 3, .., n), (3)P(2, 1, .., n), .., (n)...

    C语言重复数全排列的代码

    生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于100,其中包含重复的字符。 【输出形式】 向标准输出印...

    Java实现字符数组全排列的方法

    主要介绍了Java实现字符数组全排列的方法,涉及Java针对字符数组的遍历及排序算法的实现技巧,需要的朋友可以参考下

    排列里面的全排列,全排列,全排列

    用C++语言写的全排列,有助于理解递归,全排列,全排列,全排列,全排列

    随机全排列生成程序及其应用开发(有程序代码)

    编制生成 0~n(n≤255)的一个全排列的程序,可选择下列两个方法之一或自行设计另外方法: 方法 1:从一个随机文件读取 n+1 字节数据 d0,d1,¡ ,dn。由预先取定的一个 0~n 的全排列 P(比如,可为 0~n 的自然排列)...

    n个元素全排列

    适用于算法课程求n个元素的全排列,从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 公式:全排列数f(n)=n!(定义0!=1)

    N个数全排列c语言算法

    输入N,输出1-N全排列c语言算法,非递归算法................

    CC++全排列..1--n的全排列以及字符串的全排列

    CC++全排列..1--n的全排列以及字符串的全排列

    输出有重复字符的全排列

    输出有重复字符的全排列,C++源码......

    输出n个数字的全排列(可重复)

    1、输入n个数(不重复),求n个数字的全排列 如:n=3 全排列的数字为 1 2 3 则输出 123 132 213 231 321 312 2、输入n和k(n》=k)求n个数字的(n,k)排列 如n=3,k=2 输入的三个数位1 2 3 则输出 12 13 21 23 31...

    使用swap函数求解带有重复字符串的全排列

    这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。下面给出...

    使用for循环实现全排列

    使用for循环实现全排列是最简单最基础的一个全排列的过程,其他的全排列思想都是出自此处。

    组合数学全排列算法

    实现了字典序法、递增进位制数法、递减进位制数法、邻位对换法四种全排列算法。全排列算法有很多种,这里只是其中的一些,可以调试运行比较一下各种算法的效率。(该代码为初级版本,注重算法的实现,在交互方面需要...

    用java语言实现数字全排列

    题目描述:给定一个数列a1,a2,a3…an,输出他所有的全排列。 算法设计描述: 1、获取当前的一种排列,用start,end分别表示该排列的列头,列尾; 2、判断start是否和end相等,若相等,执行3,否则执行4; 3、将当前...

Global site tag (gtag.js) - Google Analytics