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- 当前逻辑只在同一个子数组内比较元素,但你的需求是跨子数组排序所有元素
推荐解决方案:扁平化数组后排序再重组
这种方法逻辑简单,容易理解,特别适合新手:
- 把二维数组的所有元素提取到一个一维数组(扁平化)
- 对一维数组进行标准的冒泡排序
- 把排序后的一维数组元素重新放回二维数组
完整代码示例:
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
相关产品推荐
相关产品推荐

