Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对二维数组进行对角排序?_Java_Arrays_Sorting - Fatal编程技术网

Java 如何对二维数组进行对角排序?

Java 如何对二维数组进行对角排序?,java,arrays,sorting,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| 正如你所看到的,一切都按对角线排列。下面是我的代码 已经写好了,但正如你所看到的,它

排序前:

| 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];
       }       
静态int[][]对角线(int[][]值,int n){
内部温度=0;
整数a[][];a=新整数[n][n];

对于(int ai=0;ai从您的评论中,我了解到您在按对角线顺序将一维数组的元素重新排列为二维数组时遇到了困难

可以使用以下代码执行此操作:

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++;
    }
int-sorted1d[SIZE];//注释中建议的已排序的1-D数组
int l=0;//用于访问一维数组
inti2,j2;
对于(i=n-1;i>=0;i--)

对于(j=0,i2=i;j我不会为你做家庭作业,但我会做一些观察,帮助你解决你所说的按所需顺序迭代二维数组的问题

首先,观察迭代在几个不同的“带”上运行对于一个nxn数组,有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]
如果
距离
是非负的,如果
距离
是非正的,
a[-distance][0]

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

不管怎样,我试着让代码不言自明

你可以阅读@JohnBollinger的答案来理解算法

我使用的一些结果:

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

  • 下面的公式是正确的:
    对角线=直线+列
    。写一个以位置为值的矩阵,你就会看到它


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

请阅读,然后请尝试改进并指定您的问题。请明确指定您面临的确切问题我的问题是尝试按对角线顺序(特别是上面显示的顺序)遍历数组.不清楚“对角”排序是什么意味着,虽然我看到了一种可能性。你应该确保你理解得足够清楚,然后在你尝试之前对其他人解释清楚,否则你不太可能为它编写代码。但是,一般来说,你可以考虑把所有的元素读出到一个正确长度的一维数组中,线性地排序,然后写它们。按你需要的“对角线”排列进入原始2D数组。不要为其他人做作业。这对任何人都没有帮助。我明白你的意思。但我相信这对于标记算法来说仍然是一个有效的问题。实现只是验证算法的一个奖励。