关于全排列的一些算法

· · 个人记录

关于全排列的一些算法

首先我有三个关于全排列的问题:

1.求全排列中,某一种排列的下一个

2.求全排列中,某一种排列是第几个

3.求全排列中,第n种排列是怎样的

当然,我所说的全排列是按照字典序所排列的

假如我们所要全排列的数码为1~9。

第一问:

求全排列中,某一种排列的下一个

这个问题关乎到一点点数论

先举个核桃:

1 2 3 4 5 6 7 8 9 的下一个

显然,按照字典序是

1 2 3 4 5 6 7 9 8

9 8 7 6 5 4 3 2 1 没有下一个了

所以我们能感受到,求下一个,与整个摆列的大小有关系,而且是越来越大。也就是说,我们只要找到合适的数字,做位置交换就可以了。

1 5 3 4 5 2 7 9 8

这个排列,我们首先从后往前找,找到一个数值下降:

8->9上升 9->7下降 再从右往左找比它大的最小的数字,显然是8

交换---> 1 5 3 4 5 2 8 9 7 这个时候,只是将第一个能换的数字变大了,但是按照字典序,后面的数字都要变小,所以后面要重新排列---> 1 5 3 4 5 2 8 7 9

结束了 代码是这样的:```

include<iostream>

using namespace std;

int a[10],k = 9,i,j,p; int main(){ for(i = 1;i<=9;i++) cin>>a[i]; while(a[k]<a[k-1]) k--; if(k == 1){ cout<<"No!"; return 0; } for(j = k;j<=9;j++){ int m = 100; if(a[j]>a[k-1]){ if(a[j]<m){ m = a[j]; p = j; } } } swap(a[p],a[k-1]); for(int l = k,r = 9;l<r;l++,r--) swap(a[l],a[r]); //这里的排序其实就是冒泡 for(i = 1;i<=9;i++) cout<<a[i]<<' '; return 0; }