【问题标题】:Algorithm to fill 2D array with the maximum value in the middle用中间的最大值填充二维数组的算法
【发布时间】:2019-11-27 20:43:48
【问题描述】:

有没有一种有条不紊的方法来对二维方阵的值进行排序,最大值在中间,最小值在边缘?

例子:

1 5 3 

8 9 6 

4 7 2

或:

4 8 1

6 9 5

2 7 3

我不确定哪一个是最好的,或者对于 nxn 数组(其中 n 是奇数)如何做到这一点。

【问题讨论】:

  • 为什么在您的示例中将 5、6、7、8 放置在它们的位置,以及为什么将 1、2、3、4 放置在显示的位置,为什么不放在顶部的其他位置,例如 4对,左下角的 1 等?您如何使用上述方案表示具有 1 - 25 个数字的 5 x 5 矩阵?如果你能回答这些,那就很容易实现了。
  • 是的,但您不会将排序作为二维数组进行。相反,您对项目进行线性排序,然后按优先级将它们放置在所需的位置。
  • 如果元素 1、2、3 和 4 可以在示例中的任何角落,那么它更多的是分区而不是排序问题。
  • @Prune:原则上,有很多有效展示位置这一事实可能意味着它可以更有效地完成,而无需对值进行完整排序。

标签: arrays algorithm sorting matrix 2d


【解决方案1】:

最佳时间复杂度:O(n),其中n 是正方形中的元素数。这是伪代码:

  • 假设我们有一个大小为m 的正方形。
  • 将正方形中的元素放入线性数组中(如果它们尚未保存为线性数组)。我们称之为a[1..n]。显然,n = m * m
  • 对于大小为m * m 的正方形,边框上有k = 4 * (m - 1) 元素,中间有l = max(4 * (m % 2), 1) 值。
  • 执行K'th element算法两次:
    • 首先,使用参数k 调用整个数组a[1..n] 的最小版本(第K 个最小元素)。现在,数组的第一个 k 元素,即子数组 a[1..k] 将包含数组的最小元素。
    • 其次,使用参数l 将这个算法的最大版本(第K 个最大元素)调用到剩余的子数组a[k+1..n]。现在,子数组a[k+1..k+l] 将包含数组中最大的元素。剩下的a[k+l..n] 都是其他元素。

由于K'th element 是线性的,因此该算法的整体复杂度也是线性

【讨论】:

  • 我认为您误解了这个问题。如果有人想“以最小值在开头和最大值在结尾对数组进行排序”,您是否建议他们找到最小和最大元素,将它们交换到正确的位置,然后保留数组的其余部分未修改?
  • @ruakh 可能,但该示例未显示任何排序。或者它应该按环排序——那么我的答案是错误的。
  • 我从这两个例子的理解是,对于一个 3x3 数组,角落的元素需要小于每边中间的元素,而中间的元素又需要小于中间的元素。但我不完全确定如何将其推断为(例如)25x25 数组;我能想到多种看似可能的可能性。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 2021-12-08
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
相关资源
最近更新 更多