0
        class arrayDemo {

            static void sort2D(int[][] B) {

             boolean swap = true;
             int oy=0;
             int temp=0;

             for(int ox=0;ox<B.length;ox++){
                 while(oy<B[ox].length) {
                     while(swap) {
                     swap = false;
                         for(int ix=0;ix<B.length;ix++) {
                             for(int iy=0;iy<B[ix].length;iy++) {
                                     if(B[ox][oy]<B[ix][iy]) {
                                     temp = B[ix][iy];
                                     B[ix][iy] = B[ox][oy];
                                     B[ox][oy] = temp;
                                     swap = true;
                                     }
                                 }
                             }           
                     }
                 oy++; 
                 }
             } 
             for(int row=0;row<B.length;row++)
             for(int col=0;col<B[row].length;col++)
             System.out.println(B[row][col]);
             }

public static void main(String...S) {

     int y[][] = {{10,20,0,30},{10,5,8},{3,9,8,7},{2,3}};
     sort2D(y);
}    
}

我正在尝试按升序对二维数组进行排序。

输入:{{10,20,0,30},{10,5,8},{3,9,8,7},{2,3}};输出:30,20,10,10,9,8,8,7,5,3,0,2,3

有人可以帮我知道我的代码有什么问题。

4

2 回答 2

0

您正在比较不在同一行或同一列中的元素。每个子数组都应该单独排序。您可能要重新考虑这一行if (B[ox][oy] < B[ix][iy])

于 2013-09-01T22:43:16.197 回答
0

该代码有许多问题。

  1. 它抛出ArrayIndexOutOfBoundsException。这是因为所有 for 循环测试都针对 进行测试B.length,这对于内部数组是不正确的。
  2. 您正在比较每一对元素,但有些对与其他对相反,不应测试反向对。您需要for通过从不同的索引开始来限制内部循环集的范围。

要解决所有这些问题,阻力最小的路径是将 2D 数组转储到 1D 数组并对其进行排序,这要容易得多。

这是经过测试并显示可以工作的代码:

static void sort2D(int[][] B) {

        int count = 0;
        for (int[] is : B)
            for (int i : is)
                count++;
        int[] A = new int[count];
        count = 0;
        for (int[] is : B)
            for (int i : is)
                A[count++] = i;

        int temp;
        for (int i = 0; i < A.length; i++)
            for (int j = i + 1; j < A.length; j++)
                if (A[i] > A[j]) {
                    temp = A[i];
                    A[i] = A[j];
                    A[j] = temp;
                }
        for (int i = 0; i < A.length; i++)
                System.out.print(A[i] + ",");

}
于 2013-09-01T22:44:20.563 回答