- 在线时间
- 0 小时
- 最后登录
- 2007-11-15
- 注册时间
- 2005-12-31
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 76 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 27
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 8
- 主题
- 0
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   23.16% 该用户从未签到
|
< >非递归实现,效率不错</P>
6 D! z' j) k% h. X5 f5 Q2 O5 X) l! S< >#include <iostream><BR>#include <conio.h><BR>#include <windows.h><BR>using namespace std;</P>
7 K0 X$ T- A x, E5 Z< >void output(int *p); //输出函数<BR>void permutation(int *p);//全排列函数</P>
t! v* y! w$ M, ]4 D; B7 A< >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>
( u4 S' u3 E' g! G< >void main()<BR>{<BR> permutation(p); //调用全排列函数<BR> output(p); //输出排列结果<BR> getch();<BR>}</P>
6 F$ G' J3 U0 ?4 T< >void permutation(int *p)<BR>{<BR> bool flag=false; //标志排列是否结束<BR> int temp; //临时变量,用来交换数组元素</P>
# |( A! q4 T/ ~& }. z1 t9 O7 n< > while(1)<BR> {<BR> for(int i=0;i<N-1;i++)<BR> {<BR> flag=true; //如已排列完,falg为真</P>
: i3 _2 ?) _$ u) z/ V- u: c< > if(p<p[i+1]) //如果发现第一个倒序的数组元素,p[i+1]被称为倒序元素<BR> { <BR> flag=false; //说明未排列完</P>
' f" P- \$ I4 ~5 \< > int j=0;<BR> while(p[j++]>=p[i+1]); //找到第一个大于或等于倒序元素的数组元素<BR> j-=1; </P>( o9 R1 F8 d' D/ [
< > temp=p[i+1]; //交换这两个元素<BR> p[i+1]=p[j];<BR> p[j]=temp;</P>
$ k' X& T0 P' l8 k& F* |6 [* n- A< > j=0;<BR> while(j<(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>; ?' b. E2 ^4 M- P2 x
< >void output(int *p)<BR>{<BR> cout<<endl;<BR> for(int i=0;i<N;i++)<BR> cout<<p<<' ';</P>( R! X' [8 V' V9 l- v1 @6 B
< >}<BR></P> |
|