- //N个数全排列的非递归算法
- #include"stdio.h"
- voidswap(int&a,int&b)
- {
- inttemp;
- temp=a;
- a=b;
- b=temp;
- }
- /*
- 根据当前的排列p,计算下一个排列。
- 原则是从1234–>4321,若p已经是最后一个排列,传回false,否则传回true。
- p是一个n维向量。
- */
- boolnextPermutation(int*p,intn)
- {
- intlast=n-1;
- inti,j,k;
- //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。
- i=last;
- while(i>0&&p[i]<p[i-1])
- i--;
- //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。
- if(i==0)
- returnfalse;
- //从后查到i,查找大于p[i-1]的最小的数,记入k
- k=i;
- for(j=last;j>=i;j--)
- if(p[j]>p[i-1]&&p[j]<p[k])
- k=j;
- //交换p[k]和p[i-1]
- swap(p[k],p[i-1]);
- //倒置p[last]到p[i]
- for(j=last,k=i;j>k;j--,k++)
- swap(p[j],p[k]);
- returntrue;
- }
- //显示一个排列
- voidshowPermutation(int*p,intn)
- {
- for(inti=0;i<n;i++)
- printf("%d",p[i]);
- printf("\n");
- }
- intmain(intargc,char*argv[])
- {
- intn;
- int*p;
- scanf("%d",&n);
- p=newint[n];
- for(inti=0;i<n;i++)
- p[i]=i+1;
- showPermutation(p,n);
- while(nextPermutation(p,n))
- {
- showPermutation(p,n);
- }
- //delete[]p;
- return0;
- }
本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/702551