我需要按升序排列列。现在我已完成以下操作但是,它正在排序行而不是列。任何帮助都会很好,我一整天都在努力。感谢。
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;
}
答案 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获取所有值,将其分配给临时数组并对列进行排序。
希望有所帮助