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

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

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类似,但它更简单,因为每个项目都可以与相邻项目交换,而不仅仅是与空白区块交换.

最佳答案 在一维数组中,不仅冒泡排序只交换相邻元素,而且它也只比较相邻元素.

没有类似的东西真的适用于二维数组,因为你无法检测到它

1 2 4
3 5 6
7 8 9

是乱序的(因为你不能直接比较非相邻的3和4).

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

点赞