Java数组升序排序算法异常排查:自定义代码输出错误求助
问题排查与修正:你的自定义排序算法逻辑错误解析
咱们一步步拆解你的排序代码里的问题,以及如何修正:
核心问题分析
你的代码存在三个关键逻辑错误,导致arrSort无法得到正确的升序结果:
仅执行了一轮相邻元素比较,未完成完整排序
排序算法(比如常见的冒泡排序)需要多轮遍历数组,每一轮把当前未排序部分的最大值“推”到末尾,直到整个数组有序。而你的代码只跑了一轮遍历,仅仅处理了相邻元素的单次交换,根本没完成全数组排序。arrSort的赋值逻辑完全错误
你只是在每次相邻比较后,把当前i位置的元素(或交换后的小值)零散赋值给arrSort[i],这并没有构建出完整的排序数组。而且arrSort的最后一个元素(索引5)从未被赋值,int类型数组的默认初始值是0,这就是输出末尾出现0的原因。修改原数组但未利用排序后的结果
你在if分支里交换了原数组arr的相邻元素,但之后并没有把排序后的整个arr复制到arrSort,而是零散赋值,导致arrSort完全不是排序后的结果。
原代码执行过程验证(为什么输出是[33,22,11,22,11,0])
咱们走一遍原代码的执行流程:
- 初始
arr:[33,44,22,11,22,11] i=0:33 < 44,直接赋值arrSort[0] = 33i=1:44 > 22,交换后arr变为[33,22,44,11,22,11],赋值arrSort[1] = 22i=2:44 > 11,交换后arr变为[33,22,11,44,22,11],赋值arrSort[2] = 11i=3:44 > 22,交换后arr变为[33,22,11,22,44,11],赋值arrSort[3] = 22i=4:44 > 11,交换后arr变为[33,22,11,22,11,44],赋值arrSort[4] = 11arrSort[5]未被赋值,默认是0,最终输出[33,22,11,22,11,0]
修正后的代码(以冒泡排序为例)
下面是实现正确升序排序的代码,保留你想自定义排序的需求,同时修复逻辑错误:
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] arr = {33,44,22,11,22,11}; // 先复制原数组到arrSort,避免修改原数组 int[] arrSort = Arrays.copyOf(arr, arr.length); int temp; // 冒泡排序核心逻辑:多轮遍历 // 外层循环控制排序轮次,每轮确定一个最大值的位置 for (int i = 0; i < arrSort.length - 1; i++) { // 内层循环遍历未排序部分,比较交换相邻元素 // 每轮遍历长度递减i,因为末尾i个元素已经是有序的最大值 for (int j = 0; j < arrSort.length - 1 - i; j++) { if (arrSort[j] > arrSort[j + 1]) { // 交换相邻元素 temp = arrSort[j]; arrSort[j] = arrSort[j + 1]; arrSort[j + 1] = temp; } } } System.out.println(Arrays.toString(arrSort)); // 输出:[11, 11, 22, 22, 33, 44] } }
代码说明
- 使用
Arrays.copyOf复制原数组到arrSort,避免修改原始输入数组。 - 外层循环控制排序轮次,每一轮都会将当前未排序部分的最大值移动到末尾。
- 内层循环负责相邻元素的比较与交换,每轮遍历的长度会随着已排序元素的增加而缩短,提升效率。
内容的提问来源于stack exchange,提问作者John R.
相关产品推荐
相关产品推荐

