什么是这个问题和解决方案算法的正确名称?

时间:2011-08-15 10:33:11

标签: algorithm sorting

我有一个包含唯一整数的2D数组 - 这代表一个带行/列的物理容器 - 每个位置都有一个小瓶。

我知道应该在数组中的整数以及它们应该位于何处。

然而,我的数组在错误的位置可能存在许多/所有唯一整数。

我现在需要对数组进行排序 - 但是这会映射到物理过程,因此我真的希望减少由于潜在的人为错误而导致的排序步骤数。

这只是一个简单的类型吗?或者这个场景是否有更具体的名称?有众所周知的解决方案吗?

我的同事建议只用[2] [1]类型指令创建一个swap [1] [1]列表,这似乎是合理的,但如果掉期顺序很重要,我就无法理解。

感谢所有的帮助。

3 个答案:

答案 0 :(得分:3)

如果你真的可以通过查看它所属的小瓶来判断,最简单的方法是将第一个小瓶放在错误的地方,然后放在它所属的地方,拿走那里的东西,放它到了适当的地方等,直到你碰巧得到属于你最初制造“洞”的小瓶。然后重复一遍。

由于您最多取出一个小瓶一次,并且只有在错误的地方取出时,我认为这对于物理运动来说是最佳的。

答案 1 :(得分:2)

排序算法通过比较的数量和所需的交换次数进行分析。因为对于操作人员而言,交换的成本远高于比较的成本,所以您需要2D排序,以最大限度地减少所需的交换的数量。

答案 2 :(得分:2)

“如果互换顺序很重要,我就无法理解。”

我一般是的,确实如此。举一个简单的例子,考虑3个元素的起始列表X Y Z

“交换1与2,然后2与3”的结果是Y Z X

“交换2与3,然后1与2”的结果是Z X Y

对于每个不合适的元素,您提出的互换列表可能(最多)1,并且将该元素与其正确位置的任何元素交换。例如,您可以将[0][0]交换到它所属的任何位置。除非它所属的地方碰巧包含属于[0][0]的元素,否则您的下一次交换可能会再次[0][0] 所属的地方。因此,交换的顺序当然很重要 - 第二次交换只是正确的,因为第一次交换已经发生,并将一些特定元素移动到[0][0]

如果两个连续掉期不相交,那么您可以撤消其顺序:(1 2)(3 4)相当于(3 4)(1 2),其中(x y)是“与x交换x”的数学符号

这是一个定理,任何排列都可以写成一组不相交的循环。除了循环中您选择首先列出的元素以及列出循环的顺序(这两个循环与结果无关)之外,这种循环分解是唯一的。符号(1 2 3)表示“移动1到2,2到3和3到1”,并且是3个循环。它与(2 3 1)完全相同,但与(1 3 2)不同。

根据人类手术的工作方式,他们进行n周期而不是等效的n周期可能更有效率。因此,一旦你知道如何对数组进行排序(也就是说,你知道必须对它进行排列以使其按顺序排列),那么最好的办法就是生成分解。