使用Arrays.sort对最后一行排序2d数组

时间:2011-05-26 22:25:49

标签: java algorithm sorting matrix

是否可以使用Java中的Arrays.sort(,)排序最后一行的2d-array。以下代码段非常适合按最后一列进行排序,但似乎没有办法根据最后一行进行排序。

我的第一个想法是使用将列转换为行,进行排序,然后将行转换为列。对于非常大的数组有更好的方法吗?

int[][] twoDim = { {1, 2, 3}, {3, 7, 11}, {8, 9, 16}, {4, 2,8}, {5, 3, 9} };
Arrays.sort(twoDim, new Comparator<int[]>() {
     @Override
     public int compare(int[] o1, int[] o2) {
         return ((Integer) o1[2]).compareTo(o2[2]);
     }
});

让我们详细说明整个情况: 这是我在我的数组初始化时的位置,按行和列,您可以将此数据集想象如下:

{1, 2, 3}, //first row with three columns
{3, 7, 11}, //second row with three columns
{8, 9, 16},
{4, 2, 8},
{5, 3, 9} //last row with three columns

按最后一行排序意味着重新排列第一列和第二列的位置,因为5大于3.所以在重新排列数据集后,它看起来像:
2, 1, 3
7, 3, 11
9, 8, 16
2, 4, 8
3, 5, 9 //now it's ordered by last row (first and second column have changed they position, by chance third column is in a right place already)

3 个答案:

答案 0 :(得分:1)

如果我正确理解列和行的含义,则无法解答。

如果你看一下这样的数据集:

1, 2, 3
3, 7, 11
8, 9, 16
4, 2, 8
5, 3, 9

现在,如果你按最后一行排序,你会得到以下结果:

{2, 7, 9, 2, 3}, {1,3,8,4,5}, {3, 11, 16, 8, 9}

如果将4, 2, 8行替换为5,3,9行,则显然不会出现这种情况。 因此,您必须提出标准订购,或者找到一种不同的方法来解决您面临的实际问题。

如果您正在处理矩阵,我强烈推荐library

答案 1 :(得分:0)

有趣的问题。

我会通过实施quick sort的变体来实现。变体基本上在partition函数中:

  • 您使用矩阵的最后一行作为要排序的数组
  • 交换两个元素时,实际上交换了矩阵的两列

这是一个实现:

public void qsortOnLastRow(int[][] matrix, int left, int right) {
    if (left < right) {
        int i = partition(matrix, left, right);
        qsortOnLastRow(matrix, left, i - 1);
        qsortOnLastRow(matrix, i + 1, right);
    }
}

public int partition(int[][] matrix, int left, int right) {
    int lastrow = matrix.length - 1;
    int pivotValue = matrix[lastrow][left];
    int i = left;
    for (int j = left + 1; j <= right; j++) {
        if (matrix[lastrow][j] <= pivotValue) {
            i++;
            swapColumns(matrix, i, j);
        }
    }
    swapColumns(matrix, left, i);
    return i;
}

public void swapColumns(int[][] matrix, int c0, int c1) {
    if (c0 != c1) {
        for (int i = 0; i < matrix.length; i++) {
            int t = matrix[i][c0];
            matrix[i][c0] = matrix[i][c1];
            matrix[i][c1] = t;
        }
    }
}

您可以通过致电int[][] matrix;

qsortOnLastRow(matrix, 0, matrix[0].length - 1)进行排序

复杂性,如果我没错,应该是O(m * n * log n),其中m =行数,n =矩阵中的列数。

注意:您可以使用相同的技巧(排序最后一行和交换列)以及其他排序算法。

答案 2 :(得分:0)

请记住,二维数组是数组的数组。每种排序算法都需要一个工具来移动您要排序的条目。您按最后一列排序的解决方案有效,因为Arrays.sort将您的内部数组视为要排序的对象。您所谓的最后一行排序,没有等效对象,它应该代表列。

所以你有两个选择:

  1. 实现自己的排序算法,一次交换整列,但请使用教科书算法。

  2. 转置矩阵。但请记住,如果可以在整个程序中交换第一个和第二个索引的含义,这可能是免费的。