1

或者例如,如果给您“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 的数学过程是什么?

4

2 回答 2

0

好吧,一种选择可能是:

从一个步骤走到下一个步骤,

  • 设 p = n-1
  • 你取第 (p) 个字母 abdc => d。
    • 你根据你的订单拿下一封信。
      • 如果它存在,那么你写它,然后用剩下的字母结束你的单词
      • 否则,p = p - 1 并且您返回上一步。

不确定这是最好的方法。为什么要从一步走到下一步?为什么不写所有的单词,从写 (n-1) 开始!单词以第一个字母开头,然后是 (n -1)!秒...

a
a
...
a
b
b
...
b

对于这些单词中的每一个:继续(n-2)!用第二个字母和(n-2)!第三个字母:

ab
ab
...
ab
ac
ac
....
ac
....
ba
ba
...
bc
bc
....

等等

于 2013-07-19T09:21:22.027 回答
0

如果英语是我的母语,我可以向你解释这个问题的方方面面。现在只需给出我的代码(它自己解释)以进行整数排列:

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;
        }
    }

} 
于 2013-07-19T09:33:52.253 回答