目录
思想
假设给定6,那么输出的顺序应该是 : 123546,123564,123645 ,123654,124356 …..654321
主函数main
int main(int argc, char const *argv[])
{
cout << "Input an number..." << endl ;
int n;
cin >> n;
Permu(n);
return 0;
}
Permu(int n)
void Permu(int n){
std::vector<int> v;
for (int i = 0; i < n; ++i)
{
v.push_back(i+1);
cout << i+1;
}
if (n==1) return;
while(next_permu(v, n));
}
将1,2,3…n压入一个vector,每次调用next_permu()来产生并输出一个一个排列。
next_permu(vector& num, n)
bool next_permu(vector<int>& num, int n){
int i = n - 2; int ii = n - 1;
while(num[i] > num[ii])
{
--i;
--ii;
}
if (i < 0) return false;
ii = n -1;
while(num[i] > num[ii])
{
--ii;
}
swap(num[i], num[ii]);
ii=n-1; i=i+1;
while(i < ii)
{
swap(num[i], num[ii]);
++i; --ii;
}
for(auto c : num )
cout << c;
cout << endl ;
return true ;
}
比如某次num里面的元素为123456,那么调用一次next_permu函数后,变为123465,然后再调用next_permu,变为123546,123564,123645 ,123654,124356 …..注意第一个while循环和第二个while循环的语句块不同,实现的功能也不同:第一个while循环的作用是确定i,找到将用于交换的第一个元素; 经过第一个循环体后,重新定位ii,而对i不重新定位,第二个循环体的作用是找出比num[i]大的最小整数,同时这个整数也是小于等于第一次while循环ii所指向的num[ii],用于完成两者的交换。这样交换之后,num[i]之后的元素都是降序排列,然后再重新定位i和ii(ii=n-1; i=i+1;), 当i