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

转载 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

全排列算法与全组合算法

转载自董的博客:http://dongxicheng.org/structure/permutation-combination/ 1. 前言 本文介绍了常用的排列组合算法,包...
  • dw903632958
  • dw903632958
  • 2013年04月27日 22:28
  • 1376

算法--生成1~n的排列

在暴力求解法中,我们常常要用上枚举一些简单内容以便方便获得解,若要输出整数n的前n个整数的全排列,则按字典序输出为: (1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(...
  • hhhzua
  • hhhzua
  • 2015年04月05日 19:54
  • 653

C++:排列组合算法

转载请注明出处 排列组合数是一种非常实用的工具,计算出所有的排列组合可以解决一些实际的工程问题。所以,掌握计算排列组合的方法是十分必要的。 目前,网上已经有一些计算排列组合数的算法,比如http://...
  • DeepMindMan
  • DeepMindMan
  • 2016年08月20日 22:47
  • 9873

全排列的四种生成算法

1.字典序法   字典序法中,对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12...
  • gaixm
  • gaixm
  • 2015年10月20日 21:00
  • 1492

全排列(Perm)的递归实现算法

【什么是全排列】 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。用123来示例下,123的全排列有123...
  • zhi_jin
  • zhi_jin
  • 2017年04月05日 17:47
  • 892

生成全排列算法详解

递归+回溯+SWAP。字典序
  • Dafang_Xu
  • Dafang_Xu
  • 2015年10月17日 17:20
  • 1920

全排列与全组合的非递归C语言实现

/***Perm.h*****/ #ifndef _ALGORITHM_PERM_H #define _ALGORITHM_PERM_H #include //回调函数, 每个排列或组合的结果均做为...
  • robin51201
  • robin51201
  • 2017年06月22日 15:29
  • 446

全排列和全组合实现

转自:http://wuchong.me/blog/2014/07/28/permutation-and-combination-realize/ 全排列和全组合实现 记得@老赵之前在微博上吐槽...
  • ly969434341
  • ly969434341
  • 2016年04月28日 09:26
  • 1772

排列数(输出0~9的全排列)-蓝桥杯算法提高

问题描述   0、1、2三个数字的全排列有六种,按照字母序排列如下: 012、021、102、120、201、210 输入一个数n 求0~9十个数的全排列中的第n个(第1个为0123456...
  • liuchuo
  • liuchuo
  • 2016年07月22日 15:00
  • 1783

排列组合和回溯算法-面试题

排列组合和回溯算法的面试题
  • sunxianghuang
  • sunxianghuang
  • 2016年07月13日 15:02
  • 1888
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个排列、组合的生成算法
举报原因:
原因补充:

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