一个排列、组合的生成算法

转载 2006年06月01日 22:53:00
一个排列、组合的生成算法
 


 
 

给定数字1~n,输出从中选出m个数的排列和组合。
为了简单起见,采用递归算法来描述,首先解决排列问题:
这个算法不太漂亮,用到了两个全局变量:
int     ARR[] = { 1,2,3,4,5};     // 用来输出的全局缓冲区
int     PERM_LEN;       // 排列的长度

void permutation( int arr[], int n, int m )
{
   int i;
 if(  m== 0 )
 {
  for(i=0;i<PERM_LEN;++i)
      printf(" %d",ARR[i]);
  printf("/n");
  return;
 }
 for(i=0; i<n; ++i)
 {  
  swap( arr[i], arr[0] );
  permutation( arr+1, n-1, m-1 );
  swap( arr[i], arr[0] );
 } 
}
算法比较简单,不详细说明了。

组合算法比较有趣,先看99年左右的高程辅导书上的解法,
这里面使用了一个全局变量,用来控制输出宽度:
int k;   // 用来控制输出宽度的全局变量,注意取值为组合的宽度r

void comb2( int n,int r)
{
 int i;
 for( i=n;i>=r;i--)
 {
  if( i!=n && k!=r )
  {
   int temp ;
   for( temp =1; temp<=(k-r)*3;temp++)
    printf(" ");
  }
 
  printf("%3d",i);

  if( r> 1 )
   comb2( i-1, r-1 );
  else
   printf("/n");

 }
}
原理也很简单,不详细说明了。
这种组合的输出结果如下:
  5  4  3
           2
           1
       3  2
           1
       2  1
  4  3  2
           1
       2  1
   3  2  1
自己也写了一下,使用一个缓冲区记录选取的组合数,来输出全部的组合序列:
算法如下:
void comb( int n, int m ,int buff[], int& count )
{
 if( m == 0 )
 {// 递归退出条件,打印回车
  for( int i=0;i<count;++i)
   printf("%d ", buff[i] );
  printf("/n");
  return;
 } 
 for( int i=0; i<= n - m; ++i )
 {
  buff[count++] = n-i;
  comb( n-i-1, m-1,buff,count );
  --count;
 }
}
输出的结果如下:
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1

相关文章推荐

一个组合加全排列的面试算法题及其解

题目:         给定

从m个不定长数组中 各取一个元素的组合生成算法

有M个盒子 每个盒子中有不同数量的球 从每个盒子中各取一个球的组合数量很容易算出: M个盒子中球数量的连乘积 例如 有4个盒子 盒子中球的数目分别是 3个 2个 2个 4个 组合的数量为...

组合数学中的全排列生成算法

  • 2009年10月22日 00:12
  • 124KB
  • 下载

组合数学——排列数生成算法详解(zz)

组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处。 不论是哪种全排列生成算法,都遵循着“原排列”→“原中介...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年07月24日 15:29
  • 1599

C语言算法—(生成数字的组合升级)生成数据的全排列(类似建立树的回溯法)

其实我们可以看到,在上一个算法(生成数字的组合)中,生成的数据中包含了已知数据的全排列在其中了; 所以我们可以对上一个程序生成的数据进行一次筛选就可以得到全排列;首先,给出上一个算法(生成数字的组合...

求一个整数的组合数算法(java)

求一个序列,其中任意n个数字相加不会等于该序列里的其他值,任意一个数字的倍数不等于该序列里的其他值 http://blog.csdn.net/codearhat/article/deta...

[面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合

[面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合 分类: 笔试面试 2012-05-10 17:23 1614人阅读 评论(0) 收藏 举报 算法面试优化存...

利用动态规划(非递归)探索一个高效的(n,m)组合算法,名字待定

我们知道,排列组合的组合算法主要有两种,递归法或者01转换法,这里要介绍一种全新的罗列n个元素里不重复选取m(m>1 且 m...

算法:在一个集合中选取所有符合条件的元素组合

做了好几个题目都遇到题中的场景。于是写了个算法,元素组合条件是求和。 算法能适应的场景要求组合条件可以拆分的,有对应的逆运算。代码实现的是取三个元素和在40~60之间的组合。循环n(testList...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个排列、组合的生成算法
举报原因:
原因补充:

(最多只允许输入30个字)