如何使用序数法来生成全排列
- 思考了一上午的伪代码最后写出来的,不理解可以与我讨论!代码片段可以直接运行
public void GenReverseOrder(int n){
int[] rvs_num = new int[n];
int[] perm = new int[n+1];
int[] kong = new int[n+1];
int p_num = 1;
for (int i = 0; i < n; i++)
rvs_num[i] = 0;
for (int k = 1; k <= n; k++) {
perm[k] = k;
}
while (true) {
PrintPerm(perm,n);
//如何求下一排列
rvs_num[1] +=1;
int i = 1;
while(i<n && rvs_num[i]>i ){
rvs_num[i] = 0;
if(++i<n) {
rvs_num[i] += 1;
} else{
break;
}
}
if(i == n){
break;
}
//kong[2]存放第2个空位所在位置
for (int k = 1; k <= n; k++) {
kong[k] = k;
}
for(int k = n;k>=2;k--){
int q = rvs_num[k-1];
int r = k-q;
perm[kong[r]] = k;
for(int j =r;j<=k-1;j++){
kong[j] = kong[j+1];
}
}
perm[kong[1]] =1;
}
}
private void PrintPerm(int[] perm, int n) {
for (int i = 1; i <= n; i++) {
System.out.print(perm[i]+" ");
}
System.out.println();
}