将数组排列到所有可能的对中

时间:2017-01-29 17:50:55

标签: c arrays algorithm

我正在处理一个问题(在C中),它要求我列出偶数个点之间的所有可能连接,以便每个点只连接到另一个点。例如,假设我有第1,2,3和4点:

  • 1 - 2,3 - 4
  • 1 - 3,2 - 4
  • 1 - 4,2 - 3

点的顺序无关紧要(1 - 2与2 - 1相同),连接顺序也不一样(1 - 2,3 - 4与3 - 4,1 - 2相同) )。

我目前正在尝试简单地将{1, 2, 3, 4}等数组排序为所有可能的排序,并检查它是否已经生成。然而,这可能非常昂贵,并且还需要忽略点和对的排序。

将数组排列到所有可能的对中会有什么更好的方法?我们将非常感谢算法的基本概要!

编辑:在上面带有{1, 2, 3, 4}的示例中,如果配对表示为数组中的两个相邻元素,则所有可能的结果将是:

  • {1, 2, 3, 4}:1 - 2,3 - 4
  • {1, 3, 2, 4}:1 - 3,2 - 4
  • {1, 4, 2, 3}:1 - 4,2 - 3

我需要整个排列的数组来执行基于所有连接的计算。

1 个答案:

答案 0 :(得分:1)

这可以通过不确定地配对最右边的未配对元素和递归来实现。在C:

void enum_matchings(int n, int a[static n]) {
    if (n < 2) {
        // do something with the matching
        return;
    }
    for (int i = 0; i < n-1; i++) {
        int t = a[i];
        a[i] = a[n-2];
        a[n-2] = t;
        enum_matchings(n-2, a);
        a[n-2] = a[i];
        a[i] = t;
    }
}