全排列算法所有实现方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BuptZhengChaoJie/article/details/52797506

一、递归

void permutation(char* a,int k,int m)  
{  //a是序列数组,k是开始位置,m是最后位置
    int i,j;  
    if(k == m)  
    {  
        for(i=0;i<=m;i++)  
            cout<<a[i];  
        cout<<endl;  
    }  
    else  
    {  
        for(j=k;j<=m;j++)  
        {  
            swap(a[j],a[k]);  
            permutation(a,k+1,m);  
            swap(a[j],a[k]);  //还原原来的数组
        }  
    }  
}  

非递归

void permutation( char *s )   //全排列函数
{
    char *pEnd = s + strlen(s) - 1;
    char *p = pEnd;  //p代表替换点
    //q代表替换点的下一个数 ,pMax 代表替换点后比替换点大的最小数
    char *q = new char,*pMax = new char;  //注意初始化!!!
    while (p !=  s)          //p == s 就结束循环
    {
        q = p;
        p--;
        if (*p < *q)
        {
            pMax = FindMaxForOne(p,pEnd);  //找与替换点交换的点
            Swap(p,pMax);         //交换
            Reverse(q,pEnd);       //将替换点后所有数进行反转
            Print(s);              //输出
            p = pEnd;             //将替换点置最后一个点,开始下一轮循环
        }
        if (s == p) break;           //结束条件
    }
}
char* FindMaxForOne(char *p,char *q){
    char *p1 = p;
    char *p2 = q;
    while (*p2 <= *p1)
        p2--;
    return p2;
}

猜你喜欢

转载自blog.csdn.net/BuptZhengChaoJie/article/details/52797506