您的位置:首页 > 其它

全排列

2016-05-20 15:55 218 查看
全排列涉及的范围很多。先讲一讲全排列的定义。【定义】从n个不同元素中n个元素,按照一定的顺序排列起来,像这样所有的排列情况叫全排列。
如1,2,3的全排列是:
123
132
213
231
312
321
全排列函数f(n)=n!(指n的阶乘:1*2*3*……*n)下面来说一说关于全排列的算法。【经典题目】1,给定一组数和这组数的一种全排列,输出下一组数的全排列。
【实现】voidnext(){intx,y,j,bo=0;for(x=n;x>=1;x--)if(a[x]>a[x-1])break;y=x;for(j=x;j<=n;j++)if(a[j]==a[x-1]+1){bo=1;break;}if(bo)y=j;swap(a[x-1],a[y]);intb[101];for(intk=x;k<=n;k++)b[k]=a[n-(k-x)];for(intk=x;k<=n;k++)a[k]=b[k];}
2,给定一个全排列,输出它是第几个。【题意分析】这一道题就相对简单一些。
还是举刚才的例子:13542
#include<cstdio>usingnamespacestd;intn;inta[101];intjs[101];intt,sum,ans=0;intmain(){scanf("%d",&n);for(inti=1;i<=n;i++)scanf("%d",&a[i]);js[1]=1;for(inti=2;i<=n;i++)js[i]=js[i-1]*i;for(inti=1;i<=n;i++){t=n-i;sum=0;for(intj=i;j<=n;j++)if(a[j]<a[i])sum++;ans+=sum*js[t];}printf("%d",ans+1);return0;}
未完待续……
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: