Java冒泡排序代码内层for循环使用lastPos-1作为判定条件的疑问
冒泡排序内层循环边界问题解答
核心原因
冒泡排序的核心逻辑是相邻元素两两比较、交换,你当前遍历的索引i始终需要和i+1位置的元素配对判断,这就要求i+1不能超过数组的有效索引范围,也不能超过当前轮次需要参与比较的最后位置。
以你举的长度为10的数组为例,数组有效索引范围是0~9,初始lastPos=9:
- 如果内层循环用
i <= lastPos作为判定条件,i最大会取到9,此时访问array[i+1]就等于访问array[10],直接触发ArrayIndexOutOfBoundsException数组越界异常,程序直接崩溃。 - 用
i <= lastPos -1作为判定条件时,i最大取到8,i+1=9刚好是当前轮次最后一个需要参与比较的位置,既不会越界,也能覆盖所有需要对比的相邻元素对。
额外提示
你贴出的参考代码里存在笔误:
// 原代码错误写法,i从0开始时会访问array[-1]直接越界 if(array[i] > array[i -1])
正确的判断逻辑应该是和后一个元素对比,改成:
if(array[i] > array[i + 1])
这样才能实现相邻元素大小判断、交换的冒泡逻辑。
补充说明
外层循环的lastPos每轮递减1,是因为每一轮冒泡结束后,当前未排序区间里最大的元素会被交换到lastPos的位置,属于已经排好序的部分,下一轮不需要再参与比较,内层循环的边界也随之同步收缩,避免做无用的重复比较。
内容的提问来源于stack exchange,提问作者JulianTheProgrammer
相关产品推荐
相关产品推荐

