输出一组数字的所有排列
输出一组数字的所有排列,最简单的算法是什么? <P>递归,从VChelp的算法版主那里抄来的:</P><P><BR>#define N_permutation 5 // 排列元素数量</P>
<P>unsigned char flag; // 标记元素是否被使用<BR>unsigned char dat; // 记录临时元素队列<BR>unsigned char p_dat=0; // 对列指针</P>
<P>void out_dat() // 输出对列dat中的内容<BR>{<BR> for(int i=0;i<N_permutation;i++)<BR> cout<<dat<<' ';<BR> cout<<endl;<BR>}</P>
<P>void permutation() // 再入函数,生成N_permutation个字母的所有排列,<BR>{ // 最大递归次数为N_permutation<BR> unsigned char i; // 被再入函数入栈保护的局部变量<BR> for(i=0;i<N_permutation;i++) <BR> {<BR> if (flag==0)<BR> {<BR> flag=1; // 标记元素被使用<BR> dat=0x41+i; // 将字母添加到队列<BR> p_dat++; </P>
<P> 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> <P>前头要加上:</P>
<P>#include <iostream><BR>#include <conio.h><BR>using namespace std;<BR></P> <P>非递归实现,效率不错</P>
<P>#include <iostream><BR>#include <conio.h><BR>#include <windows.h><BR>using namespace std;</P>
<P>void output(int *p); //输出函数<BR>void permutation(int *p);//全排列函数</P>
<P>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>
<P>void main()<BR>{<BR> permutation(p); //调用全排列函数<BR> output(p); //输出排列结果<BR> getch();<BR>}</P>
<P>void permutation(int *p)<BR>{<BR> bool flag=false; //标志排列是否结束<BR> int temp; //临时变量,用来交换数组元素</P>
<P> while(1)<BR> {<BR> for(int i=0;i<N-1;i++)<BR> {<BR> flag=true; //如已排列完,falg为真</P>
<P> if(p<p) //如果发现第一个倒序的数组元素,p被称为倒序元素<BR> { <BR> flag=false; //说明未排列完</P>
<P> int j=0;<BR> while(p>=p); //找到第一个大于或等于倒序元素的数组元素<BR> j-=1; </P>
<P> temp=p; //交换这两个元素<BR> p=p;<BR> p=temp;</P>
<P> j=0;<BR> while(j<(i+1)/2) //倒置倒充元素原位置以前的所有元素<BR> {<BR> temp=p;<BR> p=p;<BR> p=temp;<BR> <BR> j++;<BR> } <BR> break; //跳出for循环,<BR> }<BR> }<BR> if(flag) //如果排列完,结束循环<BR> break;<BR> //output(p); //输出排列结果<BR> }<BR>}</P>
<P>void output(int *p)<BR>{<BR> cout<<endl;<BR> for(int i=0;i<N;i++)<BR> cout<<p<<' ';</P>
<P>}<BR></P> 还有吗? 太高深了 不东 <p> <font color="#000000" size="+0">递归容易明白,就是慢,这个算法就是好.找到"倒置位"后进行倒置.</font></p> matlab里面好像有这个函数,我用过,但现在实在是既不起来了,你可以寻求帮助,但如果英语不太好,建议买一本参考教材看看相关命令,或者上网查一些有关命令的资料下载就是了,我的大部分matlab知识就是寻求网上帮助获得的,你也可以试试! 看过一篇文章是这么说的:<br/>比如说求1,2,3的全排列,<br/>先是{ 1 }<br/>然后用2,在元素里所有空当插入<br/>变成了{ 21 , 12}<br/>然后用3,在元素里所有空当插入<br/>{321,231,213,312,132,123}<br/>算法还是好实现的。<br/>不知道跟其他算法有什么效率差别。<br/>
页:
[1]