Java实现数组分段排序(偶升奇降)时奇数段排序逻辑异常
奇数排序逻辑报错的具体原因
核心错误点
你写的奇数段选择排序,内层循环的边界和遍历方向完全搞错了,和之前写对的偶数段排序逻辑根本没对齐:
- 首先明确分段边界:双指针交换完成后,数组的分段非常清晰——下标从
0到evenAmount -1全是偶数,下标从evenAmount到arr.length -1全是奇数。 - 你现在内层循环写的是
for (j = i; j > oddAmount; j++),这里有三个硬伤:- 边界判断用错了变量:拿统计出来的奇数数量
oddAmount当判断值,和实际奇数段的下标起点完全不匹配。举个例子,示例输入总长度12,其中偶数有8个、奇数有4个,也就是oddAmount=4,而奇数段实际是从下标8开始的,你拿j和4做比较,完全跳过了对奇数段位置的判断。 - 循环遍历范围错了:选择排序的逻辑是每一轮从当前位置向后的所有未排序元素里找最值,你现在的循环条件是
j > oddAmount,配合j的自增逻辑,循环会一直跑到j超出数组最大下标,直接触发数组下标越界的报错,根本没法正常完成遍历。 - 本来找最大值应该是遍历从i到数组末尾的所有元素,你现在的条件相当于把遍历范围搞混了,根本没法把所有奇数元素纳入比较。
- 边界判断用错了变量:拿统计出来的奇数数量
修正后的奇数段排序代码
完全对齐你之前偶数段的选择排序写法,逻辑统一,没有额外性能损耗:
int maxValue, maxIndex, temp2 = 0; // 外层循环覆盖整个奇数段:从偶数段结束的下一个下标,遍历到数组末尾 for (i = evenAmount; i < arr.length; i++) { maxValue = arr[i]; maxIndex = i; // 内层循环从当前i位置开始,向后遍历所有剩余奇数元素,找最大值 for (j = i; j < arr.length; j++) { if (arr[j] > maxValue) { maxValue = arr[j]; maxIndex = j; } } // 找到本轮最大值后交换到当前位置 if (maxValue > arr[i]) { temp2 = arr[i]; arr[i] = arr[maxIndex]; arr[maxIndex] = temp2; } }
额外小提醒
你现在生成的都是0~999的正随机数,判断奇偶用取模是没问题的,但如果后续扩展输入支持负整数,要注意Java里负数取模的结果是带符号的,比如-3 % 2的结果是-1,这时候判断奇数不能写==1,要写!=0,不然会漏判负奇数。
内容的提问来源于stack exchange,提问作者AnotherUsername
相关产品推荐
相关产品推荐

