c全排列解法(非递归)


只要对字符串求出字典序即可实现全排列

求法:

要考虑全排列的非递归实现,先来考虑如何计算字符串的下一个排列。如"1234"的下一个排列就是"1243"。只要对字符串反复求出下一个排列,全排列的也就迎刃而解了。

如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"、"52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0、2都不行,5可以,将5和2交换得到"956220",然后再将替换点后的字符串"6220"颠倒即得到"950226"。

代码:

Prem( 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;           //结束条件
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值