Exception in thread "main" java.lang.StackOverflowError 快排代码问题求助
StackOverflowError 报错原因
StackOverflowError 是递归调用层级超出JVM栈内存上限导致的错误,你的快速排序代码存在核心逻辑错误,导致递归无法正常收敛,最终无限触发递归调用引发该报错:
- 核心错误1:partition函数中错误将
arr[0]作为固定枢轴,而非当前处理分区的首元素arr[low]
快速排序每次处理的是[low, high]区间的子数组,你固定选择整个数组的第一个元素作为枢轴,当递归处理非起始位置的子分区时,枢轴完全不属于当前处理的区间,会导致分区逻辑完全错乱,无法正常缩小问题规模,最终陷入无限递归。 - 核心错误2:内层指针移动逻辑没有增加边界判断
没有low < high的边界约束的情况下,指针可能会移动出当前分区甚至数组边界,既会触发数组越界异常,也会导致分区返回的位置错误,打乱后续递归的区间范围。 - 次要逻辑问题:分区结束后
pivot = temp的赋值无实际作用,属于冗余代码,原代码中残留的enter code here字符也会导致编译异常。
修复后可正常运行的代码
class Solution { static void quickSort(int arr[], int low, int high) { if(low < high){ int pivot = partition(arr, low, high); quickSort(arr, low, pivot - 1); quickSort(arr, pivot + 1, high); } } static int partition(int arr[], int low, int high) { // 选择当前分区的首元素作为枢轴 int pivot = arr[low]; while(low < high){ // 右指针向左找小于等于枢轴的元素,增加边界判断防止越界 while(low < high && arr[high] > pivot){ high--; } if(low < high) { arr[low] = arr[high]; low++; } // 左指针向右找大于枢轴的元素,增加边界判断防止越界 while(low < high && arr[low] <= pivot){ low++; } if(low < high) { arr[high] = arr[low]; high--; } } // 将枢轴放到左右指针相遇的最终位置 arr[low] = pivot; return low; } }
额外优化建议
如果需要处理已经有序的大规模数组,建议选择随机位置元素、或者区间首尾中间三个元素的中位数作为枢轴,避免快排退化为O(n²)时间复杂度,递归深度过高触发栈溢出。
内容的提问来源于stack exchange,提问作者Pratulya Pratap
相关产品推荐
相关产品推荐

