将所有列独立排序为2d数组java

时间:2014-11-09 22:01:36

标签: java sorting

我需要按升序排列列。现在我已完成以下操作但是,它正在排序行而不是列。任何帮助都会很好,我一整天都在努力。感谢。

public static double[][] sortColumns(double[][] m) {
    double[][] sortedArray = new double[m.length][m.length];

    for (int i = 0; i < m.length; i++) {
        double[] temp = new double[m.length];

        for (int j = 0; j < m.length; j++) {

            temp[j] = m[j][i];
        }
        Arrays.sort(temp);
        for (int j = 0; j < temp.length; j++) {
            sortedArray[j][i] = temp[j];
        }
    }
    return sortedArray;
}

3 个答案:

答案 0 :(得分:0)

在您当前的解决方案中,您只是误解了索引,就像 David Wallace 在他的回答中告诉您的那样。我提出了一个不同的答案,列举了这个问题的可能解决方案。

您至少有4个解决方案:

  • 而不是像您当前那样存储数据,请使用矩阵的转发
  • 实现一个有效的排序算法,该算法采用二维数组和参数
  • 中列的索引
  • 在每个回合循环中,用当前列填充数组,对其进行排序,然后将其复制回来(如果您不关心使用一些额外的内存,请执行此操作)。这就是你目前正在尝试做的事情
  • 转发您的矩阵,对其线条进行排序,将其转发回来(如果您不想使用太多内存,请使用此功能)

我更喜欢最后一个解决方案,代码是:

public static double[][] sortColumns(double[][] m) {
    double[][] sortedArray = new double[m.length][m.length];

    // compute the transponate of m
    for (int i=0 ; i<m.length ; i++)
        for (int j=0 ; j<m[i].length ; j++)
            sortedArray[j][i] = m[i][j];

    // sort the lines of the transponate
    for (int i=0; i<sortedArray.length; i++)        
        Arrays.sort(sortedArray[i]);

    // transponate back the result of the sorting
    for (int i=0 ; i<sortedArray.length ; i++)
        for (int j=i+1 ; j<sortedArray[i].length ; j++) {
            double tmp = sortedArray[i][j]; 
            sortedArray[i][j] = sortedArray[j][i]; 
            sortedArray[j][i] = tmp; 
        }

    return sortedArray;
}

答案 1 :(得分:0)

如果你改变了

temp[j] = m[j][i];

temp[j] = m[i][j];

sortedArray[j][i] = temp[j];

sortedArray[i][j] = temp[j];

然后您现有的算法将正常工作。它只是意味着你要将列复制到你的临时排序区域&#34;而不是行。

答案 2 :(得分:0)

当我查看您的代码时,我会看到以下行:

double[][] sortedArray = new double[m.length][m.length];

对我来说不合适。 你需要找到阵列的长度和呼吸,所以我会做这样的事情: 长度= m.length; breath = m [0] .length;

如果我不确定所有行都有相同的元素,我可以通过for循环检查并使用max ... wud初始化导致内存浪费,但那是另一个恶魔驯服:)

接下来当我们写m [x] [y] x表示行,y表示列,所以当你这样做时:

for (int j = 0; j < m.length; j++) {

            temp[j] = m[j][i];
        }
        Arrays.sort(temp);

您从列i获取所有值,将其分配给临时数组并对列进行排序。

希望有所帮助