按序输出集合的全排列

2013-01-09 14:07:00 · 作者: · 浏览: 381

 

    简单示例代码

    [cpp]

    void swap(int *p,int*q)

    {

    int tmp;

    tmp=*p;

    *p=*q;

    *q=tmp;

    }

    void mknewseq(int *data,int start, int last)

    {

    while(start<last)

    {

    swap(&data[start],&data[last]);

    start++;

    last--;

    }

    }

    void showdata(int *data,int num)

    {

    int i=0;

    for(i=0;i<num;i++)

    {

    printf(" %d ",data[i]);

    }

    printf("\n");

    }

    int findall(int *data,int num)

    {

    int i,j;

    int lastdata=num-1;

    int tmp;

    for(i=lastdata;i>0;i--)

    {

    if(data[i]>data[i-1]) break;

    }

    if(0==i) return 0;

    tmp=i;

    for(j=lastdata;j>=i;j--)

    {

    if((data[j]>data[i-1])&&(data[j]<data[tmp]))

    tmp=j;

    }

    swap(&data[tmp],&data[i-1]);

    mknewseq(data,i,lastdata);

    return 1;

    }

    int main()

    {

    int data ={1,2,3,4};

    showdata(data,4);

    while(findall(data,4)){

    showdata(data,4);

    }

    return 0;

    }