Java二维数组升序排序代码异常:颠倒符号才生效求助
为什么你的二维数组排序结果和预期相反?
先拆解你的代码逻辑:你用四重循环遍历数组中每一对元素,当matrix[i][j] > matrix[k][l]时交换两者的位置。
原代码的实际作用
这个逻辑的本质是:把当前位置[i][j]的元素,和所有其他位置[k][l]的元素做比较——只要当前元素更大,就把它换到[k][l]的位置。
举个一维数组的简化例子,比如初始数组是[3,1,2]:
- 当
i=0(对应二维的[i][j]),k遍历所有位置:k=1时,3>1,交换后数组变成[1,3,2];k=2时,当前[i][j]是1,1<2,不交换;
- 当
i=1时:k=0时,3>1,交换后数组变成[3,1,2];k=2时,3>2,交换后数组变成[3,2,1];
- 当
i=2时,所有比较都不会触发交换;
最终得到的就是降序数组,和你遇到的情况完全一致。
为什么改<反而得到升序?
把判断条件改成matrix[i][j] < matrix[k][l]后,逻辑变成:只要当前位置[i][j]的元素比[k][l]小,就交换两者。
还是用一维数组[3,1,2]举例:
i=0时,所有比较都不会触发交换(3不小于1和2);i=1时:k=0时,1<3,交换后数组变成[1,3,2];
i=2时:k=1时,2<3,交换后数组变成[1,2,3];
最终就得到了升序数组,这就是为什么改了条件后结果符合预期。
更符合直觉的升序排序写法(参考)
其实不需要用四重循环,你可以把二维数组当成一维数组来处理,用更高效的排序逻辑,比如冒泡排序的变种:
int size = 3; // 把二维数组当作长度为9的一维数组处理 for (int i = 0; i < size * size - 1; i++) { int row1 = i / size; int col1 = i % size; // 只和当前元素之后的元素比较 for (int j = i + 1; j < size * size; j++) { int row2 = j / size; int col2 = j % size; // 前面的元素比后面的大就交换,大元素逐步往后移 if (matrix[row1][col1] > matrix[row2][col2]) { int temp = matrix[row1][col1]; matrix[row1][col1] = matrix[row2][col2]; matrix[row2][col2] = temp; } } }
这个逻辑和常规升序排序的直觉一致:让较大的元素逐步“沉”到数组末尾,最终得到升序结果。
内容的提问来源于stack exchange,提问作者Abdullah zain Haider
相关产品推荐
相关产品推荐

