基本上我有一个方法可以使用选定值的任何数字集合,并按升序重新排序,跟踪新选择的值。
所以{21,2,9,13} selectedVal = 9变为{1,2,3,4} selectedVal = 2
我现在需要做的是能够交换2个号码并保持订单不变。如果我想要将4与4交换,我需要3-> 2和4-> 3,但另一种方式就是交换3与1,因此1-> 2和2> 3.
我确信这有一个经过验证的算法,明天我可能会创造自己的乐趣,但我想在我的实际应用程序中使用最快的解决方案。
算法的名称或任何有用的链接将不胜感激。如果重要的话,我正在使用C#4.0。
编辑 - 我提出了我自己的解决方案,我认为它可以在纸上工作,但如果有人知道更好的解决方案,我仍然会喜欢回复。
假设有序列表始终从1开始,就像我的情况一样......
if (newpos < currpos)
for (int i = newpos-1; i < currpos-1; i++)
{
array[i] += 1;
array[currpos-1] = newpos;
}
else if (newpos > currpos)
for (int i = newpos-1; i >= currpos-1; i--)
{
array[i] -= 1;
array[currpos-1] = newpos;
}
else // do nothing since they are trying to swap to the same place