QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5001|回复: 8
打印 上一主题 下一主题

输出一组数字的所有排列

[复制链接]
字体大小: 正常 放大
kampoo        

85

主题

2

听众

400

积分

升级  33.33%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-12-29 14:29 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
输出一组数字的所有排列,最简单的算法是什么?
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
fewrains        

0

主题

2

听众

27

积分

升级  23.16%

该用户从未签到

新人进步奖

<>递归,从VChelp的算法版主那里抄来的:</P>- C; e, X: s1 ^2 z' c: ?+ q, }9 i
<><BR>#define  N_permutation 5 // 排列元素数量</P>5 z) a7 U+ M. _" [, \2 B
<>unsigned char flag[N_permutation]; // 标记元素是否被使用<BR>unsigned char dat[N_permutation];  // 记录临时元素队列<BR>unsigned char p_dat=0;             // 对列指针</P>0 L6 e' B% F/ h6 O2 v3 g' D' q! b& L
<>void out_dat()   // 输出对列dat中的内容<BR>{<BR> for(int i=0;i&lt;N_permutation;i++)<BR>  cout&lt;&lt;dat&lt;&lt;' ';<BR> cout&lt;&lt;endl;<BR>}</P>6 M) \# u9 s4 }9 w" s& ^5 ]
<>void permutation()          // 再入函数,生成N_permutation个字母的所有排列,<BR>{                           // 最大递归次数为N_permutation<BR> unsigned char i;           // 被再入函数入栈保护的局部变量<BR> for(i=0;i&lt;N_permutation;i++) <BR> {<BR>  if (flag==0)<BR>  {<BR>   flag=1;                // 标记元素被使用<BR>   dat[p_dat]=0x41+i;        // 将字母添加到队列<BR>   p_dat++;                  </P>/ k' Z/ y' m# O+ u! x$ i6 C
<>   if (p_dat==N_permutation) // 对列满输出,<BR>    out_dat();<BR>   else permutation();       // 否则继续添加<BR>   p_dat--;<BR>   flag=0;<BR>  }<BR> } <BR>}<BR>void main()<BR>{<BR> permutation();<BR> getch();<BR>}</P>[em07][em07][em07]
回复

使用道具 举报

fewrains        

0

主题

2

听众

27

积分

升级  23.16%

该用户从未签到

新人进步奖

<>前头要加上:</P>" x8 @5 g3 l1 y* h2 U% W
<>#include &lt;iostream&gt;<BR>#include &lt;conio.h&gt;<BR>using namespace std;<BR></P>
回复

使用道具 举报

fewrains        

0

主题

2

听众

27

积分

升级  23.16%

该用户从未签到

新人进步奖

<>非递归实现,效率不错</P>
% r2 |) k( O. l% R5 r9 g: @! {<>#include &lt;iostream&gt;<BR>#include &lt;conio.h&gt;<BR>#include &lt;windows.h&gt;<BR>using namespace std;</P>
* \5 n1 l) j3 U" B: n, h4 W<>void output(int *p);     //输出函数<BR>void permutation(int *p);//全排列函数</P>
% c9 R5 u- }4 O2 \: ^<>int a[]={1,2,3,4,5,6,7,8,9,10,11};//待排列数组<BR>int N=sizeof(a)/sizeof(int);      //数组长度<BR>int *p=a;                         //数组指针</P>
3 E  J' M% S- {0 p" h  J<>void main()<BR>{<BR> permutation(p);    //调用全排列函数<BR> output(p);         //输出排列结果<BR> getch();<BR>}</P>
8 r- p3 o" d* i. Q<>void permutation(int *p)<BR>{<BR> bool flag=false;   //标志排列是否结束<BR> int temp;          //临时变量,用来交换数组元素</P>
+ J5 e6 }1 a2 L$ N<> while(1)<BR> {<BR>  for(int i=0;i&lt;N-1;i++)<BR>  {<BR>   flag=true;     //如已排列完,falg为真</P>+ P: W  V# Y1 M
<>   if(p&lt;p[i+1]) //如果发现第一个倒序的数组元素,p[i+1]被称为倒序元素<BR>   { <BR>    flag=false; //说明未排列完</P>% D5 N2 Z& k' `# m, J5 h0 M* n
<>    int j=0;<BR>    while(p[j++]&gt;=p[i+1]); //找到第一个大于或等于倒序元素的数组元素<BR>    j-=1;                  </P>
/ X+ u7 N* F3 O0 ~<>    temp=p[i+1];           //交换这两个元素<BR>    p[i+1]=p[j];<BR>    p[j]=temp;</P>
" t4 z5 Z* f' |1 s! P: q" C: p) ]<>    j=0;<BR>    while(j&lt;(i+1)/2)       //倒置倒充元素原位置以前的所有元素<BR>    {<BR>     temp=p[j];<BR>     p[j]=p[i-j];<BR>     p[i-j]=temp;<BR>     <BR>     j++;<BR>    }    <BR>    break;                 //跳出for循环,<BR>   }<BR>  }<BR>  if(flag)                       //如果排列完,结束循环<BR>   break;<BR>  //output(p);                        //输出排列结果<BR> }<BR>}</P>
5 [' [- ^7 z2 E3 T$ q( w$ j<>void output(int *p)<BR>{<BR> cout&lt;&lt;endl;<BR> for(int i=0;i&lt;N;i++)<BR>  cout&lt;&lt;p&lt;&lt;' ';</P>
  I& C& b* ^5 I. z: o$ O8 _. V- R<>}<BR></P>
回复

使用道具 举报

dsg333        

1

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

4

主题

2

听众

24

积分

升级  20%

该用户从未签到

新人进步奖

回复

使用道具 举报

zansan        

0

主题

3

听众

44

积分

升级  41.05%

该用户从未签到

新人进步奖

<p>&nbsp;<font color="#000000" size="+0">递归容易明白,就是慢,这个算法就是好.找到"倒置位"后进行倒置.</font></p>
回复

使用道具 举报

13

主题

3

听众

53

积分

升级  50.53%

该用户从未签到

新人进步奖

matlab里面好像有这个函数,我用过,但现在实在是既不起来了,你可以寻求帮助,但如果英语不太好,建议买一本参考教材看看相关命令,或者上网查一些有关命令的资料下载就是了,我的大部分matlab知识就是寻求网上帮助获得的,你也可以试试!
回复

使用道具 举报

sjian2001        

1

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

看过一篇文章是这么说的:<br/>比如说求1,2,3的全排列,<br/>先是{  1  }<br/>然后用2,在元素里所有空当插入<br/>变成了{ 21  , 12}<br/>然后用3,在元素里所有空当插入<br/>{321,231,213,312,132,123}<br/>算法还是好实现的。<br/>不知道跟其他算法有什么效率差别。<br/>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-20 22:37 , Processed in 0.495885 second(s), 99 queries .

回顶部