通过交换对二维数组进行排序的算法

时间:2016-01-17 18:57:37

标签: arrays algorithm sorting multidimensional-array

对于一维数组,可以使用冒号排序轻松实现通过交换进行排序,例如:

5 4 9 8 7 1 6 3 2 10

需要25个掉期输出

1 2 3 4 5 6 7 8 9 10

然而,在二维数组中,我们有类似的东西。

4 2 3
1 8 5
7 9 6

项目可以垂直和水平交换,但不能对角交换:

  • 交换4和1
  • 交换8和5
  • 交换8和6
  • 交换9和8

这将成为排序数组:

1 2 3
4 5 6
7 8 9

我正在寻找一种能够有效实现这一目标的算法(最小化交换次数)。这个问题可能与15 puzzle类似,但它更简单,因为每个项目都可以与相邻的项目交换,而不仅仅是与空的瓦片交换。

2 个答案:

答案 0 :(得分:1)

在一维数组中,不仅冒泡 - 排序交换相邻元素,而且它也只是比较相邻元素。

对于二维数组而言,没有任何类似的东西真的有效,因为你无法检测到

1 2 4
3 5 6
7 8 9

无序(因为您无法直接比较不相邻的34)。

如果我们说您可以检查并比较任意元素,但更新元素的唯一方法是将其与其中一个邻居交换,那么最好的方法是从完全开始弄清楚每个元素需要结束的位置(例如,通过将元素复制到常规数组并应用标准排序算法),然后执行必要的交换以将元素移动到目的地。

答案 1 :(得分:0)

如果您具有3 x 3矩阵,那么就有9个元素,这意味着9!= 362880可能的交换。如果矩阵是4 x 4,那么16!这是20,922,789,888,000个可能的掉期。您会看到模式。不幸的是,这是一个 NP-Hard 问题,在多项式时间内并不能真正解决。到目前为止,就像15Puzzle。交换任何元素都应减少步骤数,并使查找解决方案变得更加简单。

但是,您可以尝试使用明智的搜索来找到解决方案。定义一个好的试探法以表示当前状态与目标状态之间的距离,并在A *搜索中使用该方法。那是最简单的方法。您总是可以尝试一些更复杂的操作,例如Alpha-Beta修剪。作为一种启发式方法,我可以建议每个项目与其目标位置之间的曼哈顿距离。
例如,

4 2 3
1 8 5
7 9 6

4的值为[0] [0],应该为1,因此4的汉明距离为(1-0)+(1-0)=2。这意味着您至少需要两个交换以使4移到正确位置。然后求和所有9个元素的汉明距离。那是你的州分数。

还要确保在选择下一个状态时使用优先级队列,在每一步中对边界中的最佳后继状态进行采样时,将使其变为O(1),而在添加新的后继状态时将使其变为O(logn)。 / p>

最好