排序对于二维数组没有意义...还是吗?
您的任务是获取一个输入网格,并对它应用类似于冒泡排序的算法,直到网格中的所有值沿每一行和每一列从左到右,从上到下不递减。
该算法的工作原理如下:
- 每次遍历都从上到下逐行进行,比较/交换每个单元格及其右侧和下方的邻居。
- 如果该单元格仅大于其右侧和邻域之一,则与该单元格大于
- 如果该单元格大于其右侧邻居和下方邻居,请与较小的邻居交换
- 如果单元格大于其右侧和下方的邻居(均为相同值),则与下方的邻居交换。
- 如果该单元格不大于其右侧和相邻单元格中的任何一个,则不执行任何操作
- 继续进行此操作,直到整个过程中没有进行交换为止。这是每行和每列从左到右,从上到下按顺序排列的时间。
例
4 2 1
3 3 5
7 2 1
通过的第一行将交换4和2,然后将4与1交换。
2 1 4
3 3 5
7 2 1
当我们得到中间的3时,它将与下面的2交换
2 1 4
3 2 5
7 3 1
然后将5与下面的1交换
2 1 4
3 2 1
7 3 5
第一遍的最后一行将7一直移到右侧
2 1 4
3 2 1
3 5 7
然后,我们再次回到第一行
1 2 1
3 2 4
3 5 7
并继续逐行...
1 2 1
2 3 4
3 5 7
...直到网格被“排序”
1 1 2
2 3 4
3 5 7
另一个例子
3 1 1
1 1 1
1 8 9
变成
1 1 1
1 1 1
3 8 9
而不是
1 1 1
1 1 3
1 8 9
因为当一个小区的右邻居和下邻居相等时,向下交换优先。
可在此处找到分步参考实施。
测试用例
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
变成
0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9
2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0
变成
0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9
规则
- 您可以采用任何方便的格式输入网格
- 您可以假定网格值是16位无符号范围(0-65535)中的所有非负整数。
- 您可以假设网格是一个完美的矩形,而不是一个锯齿状的数组。网格将至少为2x2。
- 如果您使用其他排序算法,则必须提供证明,无论输入什么内容,它都将始终产生与该特定品牌的2D气泡排序相同的结果顺序。我希望这是不平凡的证明,因此您最好使用上述算法。
高尔夫快乐!