You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二维数组冒泡排序求助:新手如何实现指定排序结果?

解决二维数组的冒泡排序问题

嘿,作为Java新手遇到二维数组排序的困惑太正常了,我来帮你理清思路并修正代码!首先看你的需求:要把{{98,8,103,55}, {88,48,75,1}}排序成{{1, 8, 48, 55}, {75, 88, 98, 103}},这其实是要把整个二维数组的所有元素按升序排列后,重新分成两个长度为4的子数组,而不是单独对每个子数组排序。

你的代码问题分析

先看你写的代码片段,存在几个明显问题:

  • 嵌套了四层循环,逻辑过于复杂,冒泡排序完全不需要这么多层嵌套
  • arr2[j][l] > arr2[j][l+1]会导致数组越界:当l等于子数组最后一个索引(比如3)时,l+1=4超出了子数组的索引范围(0-3),会抛出ArrayIndexOutOfBoundsException
  • 当前逻辑只在同一个子数组内比较元素,但你的需求是跨子数组排序所有元素

推荐解决方案:扁平化数组后排序再重组

这种方法逻辑简单,容易理解,特别适合新手:

  1. 把二维数组的所有元素提取到一个一维数组(扁平化)
  2. 对一维数组进行标准的冒泡排序
  3. 把排序后的一维数组元素重新放回二维数组

完整代码示例:

public class TwoDArrayBubbleSort {
    public static void main(String[] args) {
        int[][] arr2 = {{98,8,103,55}, {88,48,75,1}};
        int totalElements = arr2.length * arr2[0].length;
        int[] flatArray = new int[totalElements];
        
        // 步骤1:扁平化二维数组
        int index = 0;
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                flatArray[index++] = arr2[i][j];
            }
        }
        
        // 步骤2:对一维数组进行冒泡排序(带优化:无交换则提前结束)
        for (int i = 0; i < flatArray.length - 1; i++) {
            boolean swapped = false;
            for (int j = 0; j < flatArray.length - 1 - i; j++) {
                if (flatArray[j] > flatArray[j+1]) {
                    // 交换元素
                    int tmp = flatArray[j];
                    flatArray[j] = flatArray[j+1];
                    flatArray[j+1] = tmp;
                    swapped = true;
                }
            }
            if (!swapped) {
                break;
            }
        }
        
        // 步骤3:重新组装成二维数组
        index = 0;
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                arr2[i][j] = flatArray[index++];
            }
        }
        
        // 打印结果
        for (int[] row : arr2) {
            for (int num : row) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }
}

运行这段代码后,你会得到期望的输出:

1 8 48 55 
75 88 98 103 

补充:如果是对每个子数组单独排序

如果你之后需要对每个子数组内部单独排序(比如把原数组变成{{8,55,98,103}, {1,48,75,88}}),可以简化代码,只需要两层循环处理每一行:

public class RowWiseBubbleSort {
    public static void main(String[] args) {
        int[][] arr2 = {{98,8,103,55}, {88,48,75,1}};
        
        // 对每一行单独冒泡排序
        for (int i = 0; i < arr2.length; i++) {
            int[] row = arr2[i];
            for (int j = 0; j < row.length - 1; j++) {
                boolean swapped = false;
                for (int k = 0; k < row.length - 1 - j; k++) {
                    if (row[k] > row[k+1]) {
                        int tmp = row[k];
                        row[k] = row[k+1];
                        row[k+1] = tmp;
                        swapped = true;
                    }
                }
                if (!swapped) break;
            }
        }
        
        // 打印结果
        for (int[] row : arr2) {
            for (int num : row) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }
}

希望这些解释和代码能帮到你,有疑问随时问!

内容的提问来源于stack exchange,提问作者Scroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:01:09