或者例如,如果给您“abcd”,则词典排列将是:
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba
我直观地理解它是如何排序的,如果你给我任何一组字母或数字,我可以计算出它们应该如何排序,但不是数学上你将如何从一个步骤到下一步。例如:从 abdc 到 acbd 的数学过程是什么?
或者例如,如果给您“abcd”,则词典排列将是:
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba
我直观地理解它是如何排序的,如果你给我任何一组字母或数字,我可以计算出它们应该如何排序,但不是数学上你将如何从一个步骤到下一步。例如:从 abdc 到 acbd 的数学过程是什么?
好吧,一种选择可能是:
从一个步骤走到下一个步骤,
不确定这是最好的方法。为什么要从一步走到下一步?为什么不写所有的单词,从写 (n-1) 开始!单词以第一个字母开头,然后是 (n -1)!秒...
a
a
...
a
b
b
...
b
对于这些单词中的每一个:继续(n-2)!用第二个字母和(n-2)!第三个字母:
ab
ab
...
ab
ac
ac
....
ac
....
ba
ba
...
bc
bc
....
等等
如果英语是我的母语,我可以向你解释这个问题的方方面面。现在只需给出我的代码(它自己解释)以进行整数排列:
const int maxn = 2000;
int x[maxn];
void next_permutation(int n)
{
int i;
int min_suffix = INT_MAX;
int min_index = -1;
for(i=n-1; i>0; --i){
if(x[i] < x[i+1])break;
}
if(i==0){
for(int i=1; i<=n; ++i){
x[i] = i;
}
return;
}
for(int j=i+1; j<=n; ++j){
if(x[j]>x[i] && x[j]<min_suffix){
min_suffix = x[j];
min_index = j;
}
}
//swap x[i], x[min_index];
{
int tmp = x[i];
x[i] = x[min_index];
x[min_index] = tmp;
}
//insert_sort x[i+1...n]
{
for(int j=i+2; j<=n; ++j){
int k;
for(k=j-1; k>=i+1; --k){
if(x[j]>x[k])break;
}
int tmp = x[j];
for(int l=j-1; l>k; --l){
x[l+1] = x[l];
}
x[k+1] = tmp;
}
}
}