【问题标题】:How do I sort a 2d array diagonally?如何对二维数组进行对角排序?
【发布时间】:2017-03-03 22:13:27
【问题描述】:

排序前:

| 3 10 24  8|                      
|12 10 16 67|                       
|21 18 36 48|        
| 7  1 12 25|                       

排序后:

|12  8  3  1|
|21 12 10  7|   
|36 24 16 10|     
|67 48 25 18|

如您所见,所有内容都按对角线排序。下面是我的代码
写了,但正如你所见,它远未完成。

      static int[][] diagonal(int[][] value, int n){
          int temp= 0;
          int a[][]; a= new int [n][n]; 
          for (int ai=0; ai<n;ai++)
              Arrays.sort(value[ai]);
          for (int i=0; i<n; i++) 
              for (int j=0; j<n; j++)
                  a[i][n-1]=value[i][j];
       }       

【问题讨论】:

  • 请阅读this,然后请尝试改进并说明您的问题。
  • 请明确说明您面临的具体问题
  • 我的问题是尝试按对角线顺序(特别是上面显示的顺序)遍历数组。
  • 目前尚不清楚“对角线”排序是什么意思,尽管我看到了一种可能性。在尝试继续之前,您应该确保足够了解以便向其他人清楚地解释它,否则您不太可能为其编写代码。
  • 不过,一般来说,您可以考虑将所有元素读入一个正确长度的一维数组,对它们进行线性排序,然后以您需要的“对角线”排列将它们写回原始二维数组.

标签: java arrays sorting


【解决方案1】:

我不会为你做作业,但我会做一些观察,以帮助你解决你所说的按所需顺序遍历二维数组的问题。

首先,观察迭代在矩阵的几个不同“带”上运行,从上到下,从上到下,在每个带内。对于 n x n 数组,有 n 个这样的带,其第一个元素在顶部边缘,而 n其第一个元素在左边缘,但主对角线计算两次;因此有 2 * n - 1 个总波段。给定数组元素a[i][j],如果i + 1j + 1 小于n,则a[i + 1][j + 1] 是该带的下一个元素。

可以通过与主对角线的距离和方向来表征波段。具有第一个元素a[0][0] 的主对角线本身与自身的距离为 0。第一个元素 a[0][1] 的带的距离为 1,而第一个元素 a[3][0] 的带在负方向上的距离为 3(因为如果 a[0][-3] 存在,它将在该带中)。

要以对角线方式遍历整个数组,您需要依次遍历每个波段,从与主对角线 (n - 1) 的正距离最大的波段到另一波段负距离最大 (1 - n)。每个波段都有 n - abs(distance) 元素;第一个是a[0][distance],如果distance 是非负数,a[-distance][0] 如果distance 是非正数。

【讨论】:

    【解决方案2】:

    根据您的 cmets,我了解到您在将一维数组的元素以对角线顺序重新排列为二维数组时遇到了麻烦。

    你可以使用下面的代码来做这个排列:

    int sorted1d[SIZE]; // the sorted 1-D array suggested in comments
    int l=0; // for accessing the 1-D array
    int i2,j2;
    
    for(i=n-1;i>=0;i--)
        for(j=0,i2=i;j<n && i2<n;i2++,j++){
            output[i2][j] = sorted1d[l];
            l++;
        }
    
    for(j=1;j<n;j++)
        for(j2=j,i=0;j2<n && i<n;i++,j2++){
            output[i][j2] = sorted1d[l];
            l++;
        }
    

    希望这能解决您的问题。

    【讨论】:

      【解决方案3】:

      我在这里编写了一个解决方案:https://repl.it/GHEd

      它有效。我不是 Java 忍者(我喜欢 Ruby :))所以也许有些事情可以做得更好。

      无论如何,我试图让代码自我解释。

      您可以阅读@JohnBollinger 的回答以尝试理解该算法。

      我使用的一些结果:

      • 维度为n 的方阵有(n-1)*2 + 1 对角线。

      • 以下等式为真:diagonal = line + column。写一个以位置为值的矩阵,你会看到的。

      如果您需要进一步解释,请告诉我您不明白的地方,我会尽力澄清。

      【讨论】:

      • 不要替别人做作业。这对任何人都没有帮助。
      • 我明白你的意思。但我相信对于标签 algorithm 来说这仍然是一个有效的问题。该实现只是验证算法的一个奖励。
      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 2013-08-17
      • 2015-09-17
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多