用于置换数组中元素的算法

时间:2009-08-27 19:15:59

标签: algorithm arrays permutation

请考虑以下情况

我有一系列数字:

 [ 1,2,3,4 ]

如果此阵列已加入,我的号码为 1234

我想交换数字来实现 最高的数字

1234 将变为 1243 ,这将变为 1324 ,这将变为 1342 等等..

我需要使用什么算法在数组中进行此更改?

理想情况下,我想以这种方式使用该算法:  (假设Array将此算法称为一个名为walkthrough的函数)

 [ 1,2,3,4].walkthrough() # gives [ 1, 2, 4, 3 ]
 [ 1,2,4,3].walkthrough() # gives [ 1, 3, 2, 4 ]

数字列表继续:

1234
 1243
 1324
 1342
 2134
 2143
 2314
 2341
 2413
 2431
 3124
 3142
 3214
 3241

2 个答案:

答案 0 :(得分:9)

这为您提供了下一个排列:

bool Increase(int[] values) {
   // locate the last item which is smaller than the following item
   int pos = values.Length - 2;
   while (pos >= 0 && values[pos] > values[pos + 1]) pos--;
   // if not found we are done
   if (pos == -1) return false;
   // locate the item next higher in value
   int pos2 = values.Length - 1;
   while (values[pos2] < values[pos]) pos2--;
   // put the higher value in that position
   int temp = values[pos];
   values[pos] = values[pos2];
   values[pos2] = temp;
   // reverse the values to the right
   Array.Reverse(values, pos + 1, values.Length - pos - 1);
   return true;
}

编辑:
将Array.Sort更改为Array.Reverse。这些项目总是按降序排列,并且应该按升序排列,因此它们会得到相同的结果。

答案 1 :(得分:6)

这看起来像是要在词法顺序中生成列表的排列。这些搜索术语应该让您走上有用的道路。

例如,Python在版本2.6的itertools模块中包含了这个。该文档显示了实现此类算法的代码。