请考虑以下情况。
我有一系列数字:
[ 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
答案 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模块中包含了这个。该文档显示了实现此类算法的代码。