全排列非递归实现

对于一个数字1到4的全排列:1234-1243-1324-1342-1423-1432-2134-2143 ……
我们可以发现规律,找到下一个全排列序列的方法是:
1.从后向前找到第一个递增对(如1243中的43)
2.遍历递增对中第一个数字之后的数字a(如1243中递增对24中的2),从后向前找到第一个大于a的数字b(如1423中的3)
3.交换a,b两个数字(如1243交换后得到1342)
4.将原来a位置之后的数字升序排列(如1342中3后面升序,得到1324)

只要输入一个递增的序列,循环1到4步,即可实现非递归的全排列。

代码:

#include <iostream>
#include <algorithm>
using namespace std;

void Arrange(char * c, int len){
   int pos,posFirstBigger;
   while(1){
        bool isEnd = true;
        for(int i = 0;i<len;i++)
        cout<<c[i];
        cout<<endl;

        for(int i = len-1;i>0;i--){
            if(c[i - 1]<c[i]){
                pos = i-1;
                isEnd = false;
                break;
            }

        }

        if(isEnd)
            break;

        for(int i = len-1;i>pos;i--){
            if(c[i] > c[pos]){
                posFirstBigger = i;
                break;
            }

        }

        swap(c[pos],c[posFirstBigger]);
        sort(c+pos+1,c+len);
   }


}
int main()
{

        int num;
        cout<<"输入数字n(0<n<10),输出1-n的全排列:"<<endl;
        cin>>num;
        char c[10] = "123456789";
        Arrange(c,num);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值