Java快速排序实现遭遇IndexOutOfBoundsException,求排查帮助
快速排序实现的IndexOutOfBoundsException问题修复
核心错误分析
1. swap方法完全无效
Java是值传递,你写的swap(int a, int b)只是交换了方法参数的副本,原数组里的元素根本不会有任何变化。比如swap(arr[l], arr[h])执行后,arr[l]和arr[h]的值还是原样,这会直接导致partition逻辑混乱,进而引发后续越界。
2. 递归参数与数组拆分逻辑错误
你错误地将原数组拆分成left、right新数组,但递归调用时传入的索引完全不符合新数组的范围:
- 调用
quickSort(left,0,j)时,left数组的长度是j,最大索引是j-1,但你传入的h参数是j,直接触发IndexOutOfBoundsException。 - 更关键的是,快速排序的核心是原地排序,拆分新数组完全没必要,而且排序新数组对原数组毫无影响,完全偏离了算法逻辑。
3. partition循环存在越界风险
partition里的do-while循环没有限制i的上限,当所有元素都小于等于pivot时,i会一直递增到h+1,此时访问arr[i]就会超出数组索引范围。
修正后的代码
package qsort; public class QuickSort { public static void main(String[] args) { int arr[] = {10,16,8,12,15,6,3,9,5,100}; quickSort(arr,0,(arr.length-1)); for(int number:arr) { System.out.println(number); } } // 原地排序,无需拆分新数组 public static void quickSort(int[] arr, int l, int h) { if(l < h) { int j = partition(arr,l,h); // 递归排序左半段(l到j-1)和右半段(j+1到h) quickSort(arr, l, j-1); quickSort(arr, j+1, h); } } public static int partition(int[] arr, int l, int h) { int pivot = arr[l]; int i = l; int j = h; while(i < j) { // 限制i不超过h,避免越界 while(i <= h && arr[i] <= pivot) { i++; } // 限制j不小于l,避免越界 while(j >= l && arr[j] > pivot) { j--; } if(i < j) { swap(arr, i, j); // 传入数组和索引,直接修改原数组 } } swap(arr, l, j); return j; } // 正确的swap方法:操作原数组元素 public static void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
关键修正点
- 修复swap方法:改为接收数组和索引,直接修改原数组元素,确保交换操作生效。
- 移除多余的数组拆分:采用原地排序的递归逻辑,传入原数组的正确索引范围。
- 给partition循环添加边界限制:避免i、j超出数组的合法索引范围,彻底解决越界问题。
内容的提问来源于stack exchange,提问作者JavaJerome
相关产品推荐
相关产品推荐

