订购2D阵列

时间:2011-07-30 13:19:03

标签: c

我正在尝试解决2D阵列上的问题并且几乎不需要帮助。问题是这样的:

假设我们有一个大小为nxn的2D数组A,它包含独特的元素。需要重新排列A的元素如下。令A11,A12,A21,A22为A的四个相互不相交的子阵列,每个子阵列的大小为n / 2×n / 2。然后A11< A12< A21< A22。如果将这些子数组中的每一个递归地拆分为四个大小相等的子数组,那么该属性也会成立。

用户输入:n,N(≥n2)。 n是2的幂

我尝试过很多东西,但似乎没什么用。

3 个答案:

答案 0 :(得分:1)

您需要创建一个函数,该函数将根据相关顺序将0到n * n-1之间的索引转换为数组中的坐标。然后你就可以在一个大小为n * n的数组上运行一些常用的1D排序算法,j使用该函数替换 0 1 4 5 2 3 6 7 8 9 12 13 10 11 14 15 元素。它解决了这个问题。

更新:映射函数将此矩阵中的数字映射到它们的坐标:

{{1}}

答案 1 :(得分:1)

对于unkulunkulu的回答有点捎带我认为你可以按照以下方式进行处理:

获取矩阵中的所有值(2D)并将它们放在一个简单的数组(1D)中。然后取这个数组并将值从最低到最高排序。

现在您需要做的是再次填充矩阵,但这样做符合您指定的规则。如果您查看Z-order space filling curve in 2D,您会发现如果按此顺序填充矩阵(使用已排序的元素),则生成的矩阵具有所需的属性。

现在实际编码将取决于你。

答案 2 :(得分:1)

书籍数字配方第21.8章http://www.nrbook.com/nr3/给出了一个解析表达式,用于计算给定四叉树坐标的二维数组的索引。

enter image description here enter image description here

这是我尝试的另一种直接的方法,但我不喜欢它:

(defun quad-pos (pos)
  "POS is a list of letters that indicate the position in a 2x2 matrix [a,b; c,d]."
  (let ((x 0)
    (y 0)
    (s 1))
    (dolist (e pos)
      (setf s (/ s 2))
      (ecase e
    ('a )
    ('b (incf x s))
    ('c (incf y s))
    ('d (incf x s) (incf y s))))
    (values x y)))
#+nil
(quad-pos '(a)) ;=> 0, 0
#+nil
(quad-pos '(a b c)) ;=> 1/4, 1/8
#+nil
(quad-pos '(d d d d)) ;=> 15/16, 15/16