- 论坛徽章:
- 3
|
weichuang02 发表于 2012-09-02 15:28
求一个数列的全排列,用递归的方法很容易描述,网上也有很多例子
但是如果要求必须不能用递归,可以用堆 ...
正好之前写了个
- #include <stdio.h>
- #include <stdlib.h>
- int *flag;
- void print(int*a,int num)
- {
- int i;
- num--;
- for(i=0;i<num;i++)
- printf("%d->",a[i]);
- printf("%d\n",a[num]);
- }
- int next(int*a,int m, int n,int how)
- {
- int i,j,k,x;
- if(how) {
- for(j=n-1;j>=0;j--) {
- for(i=a[j];i<m;i++)
- if(flag[i]==0)
- break;
- if(i<m) {
- flag[a[j]-1]=0;
- a[j]=i+1;
- flag[i]=1;
- for(x=0,k=j+1;k<n;k++) {
- while(flag[x]==1)x++;
- a[k]=x+1;
- flag[x]=1;
- }
- return 0;
- }
- flag[a[j]-1]=0;
- }
- }
- else {
- if(a[n-1]<m) {
- a[n-1]++;
- return 0;
- }
- for(i=n-1;i>0;i--)
- if(a[i]>a[i-1]+1)
- break;
- if(i>0) {
- a[i-1]++;
- for(;i<n;i++)
- a[i]=a[i-1]+1;
- return 0;
- }
- }
- return 1;
- }
- int main(int argc,char**argv)
- {
- int *a,i;
- char c;
- int m,n;
- int how=0;
- c=argv[3][0];
- sscanf(argv[1],"%d",&m);
- sscanf(argv[2],"%d",&n);
- if(!(0<n&&n<=m)||(c!='P'&&c!='p'&&c!='C'&&c!='c'))
- return 1;
- a = malloc(sizeof(int)*n);
- if(c=='P'||c=='p') {
- how =1;
- flag = malloc(sizeof(int)*m);
- for(i=0;i<n;i++)
- flag[i]=1;
- for(;i<m;i++)
- flag[i]=0;
- }
- if(a==NULL)
- return 1;
- for(i=0;i<n;i++)
- a[i]=i+1;
- while(1) {
- print(a,n);
- if(next(a,m,n,how))
- return 0;
- }
- }
复制代码 |
|