MergeSort实现遇ArrayIndexOutOfBoundsException问题求助
问题根源:Merge方法里的指针变量完全搞混了
你遇到的ArrayIndexOutOfBoundsException完全是因为merge方法中对三个遍历指针(i、j、k)的对应关系和循环条件搞反了,我来给你拆解具体问题:
错误点逐一拆解:
第一个核心循环的条件完全错误
你写的循环条件是:while (j < left_length && k < right_length) {这里的指针对应逻辑完全乱了:
i才是遍历左数组left的指针,j是遍历右数组right的指针,正确的循环条件应该是i < left_length && j < right_length。收尾循环的条件与赋值逻辑错配
- 第一个收尾循环是要把左数组
left剩余的元素补到原数组里,你写的条件是while (j < left_length),这完全不对,应该是while (i < left_length)(因为i是左数组的指针)。 - 第二个收尾循环是要把右数组
right剩余的元素补到原数组里,你写的条件是while (i < right_length),正确条件应该是while (j < right_length),而且内部赋值的指针也对应错了。
- 第一个收尾循环是要把左数组
修正后的完整Merge方法
public static void merge(int[] arr, int[] left, int[] right, int left_length, int right_length) { int i = 0; // 左数组left的遍历指针 int j = 0; // 右数组right的遍历指针 int k = 0; // 原数组arr的填充指针 // 同时遍历左右数组,取较小值放入原数组 while (i < left_length && j < right_length) { if (left[i] < right[j]) { arr[k] = left[i]; i++; } else { arr[k] = right[j]; j++; } k++; // 不管取哪边的元素,原数组指针统一后移 } // 补全左数组剩余元素 while (i < left_length) { arr[k] = left[i]; i++; k++; } // 补全右数组剩余元素 while (j < right_length) { arr[k] = right[j]; j++; k++; } }
小测试建议
修复后可以先拿长度为1、2、3的极小数组测试,比如{3,1}或者{5,2,7},这种小数据量更容易快速验证指针逻辑是否正确。
内容的提问来源于stack exchange,提问作者210312312
相关产品推荐
相关产品推荐

