如何对角排序二维数组?

时间:2017-03-03 22:13:27

标签: java arrays sorting

排序前:

| 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];
       }       

3 个答案:

答案 0 :(得分:0)

根据您的评论,我的理解是您无法将1-D数组的元素重新排列为对角线序列中的2-D数组。

您可以使用以下代码进行此安排:

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++;
    }

希望这能解决您的问题。

答案 1 :(得分:0)

我不打算为你做功课,但我会做一些观察,以帮助你解决按所需顺序迭代2D数组的所述问题。

首先,观察迭代在矩阵的几个不同的“波段”上运行,从顶部,左侧到底部,右侧在每个波段内。对于 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 :(得分:-1)

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

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

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

你可以阅读@ JohnBollinger的答案,试着理解算法。

我使用的一些结果:

  • 尺寸n的方阵具有(n-1)*2 + 1对角线。

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

如果您需要进一步解释,请告诉我您不理解的内容,并且我会尝试澄清。