排序前:
| 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];
}
答案 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 + 1
和j + 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
。写一个位置为值的矩阵,你会看到它。
如果您需要进一步解释,请告诉我您不理解的内容,并且我会尝试澄清。