对于一个数字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步,即可实现非递归的全排列。
我们可以发现规律,找到下一个全排列序列的方法是:
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);
}