使用快速排序,在递归时,导致栈溢出的错误

枣园小文文 2016-10-05 01:54:33

public static void main(String[] args) {
int[] arr = { 9, 4, 7, 2, 3, 18, 10, 5, 6 };
quickSort(arr, 0, arr.length - 1);// 快排
}
private static void quickSort(int[] arr, int left, int right) {
if (left > right) {
return;
}
int i = left;
int j = right;
int baseNum = arr[left]; // 把最左边的数当做基准数

while (i != j) {
while (arr[j] >= baseNum && j > i) {// 满足这个条件,就一直从右往左检索
j--;
}
while (arr[i] <= baseNum && i < j) {// 满足这个条件,就一直从左往右检索
i++;
}
// 如果代码走到这里,说明i和j都找到了相应的数
if (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 如果i和j相遇,就执行以后代码
arr[left] = arr[i];// 把i位置的数赋值给基准数
arr[i] = baseNum;// 把基准数赋值给i位置的数
// 一轮交换完毕


//问题出现在下边两行代码!!!!!!!!!!报错


quickSort(arr, 0, i - 1);// 排基准数的左边
quickSort(arr, j + 1, arr.length - 1);// 排基准数的右边
}


我有点不明白left和right并没有重新赋值,初始值为0和arr.length-1,为什么上边的有问题,报一个堆栈溢出错误????????

如果改成下边这样就没有问题,!!!!!!!!!!!//没问题
quickSort(arr, left, i - 1);// 排基准数的左边
quickSort(arr, j + 1, right);// 排基准数的右边


或者把其中一个改了,也没问题如下面!!!!!!!!!!!//没问题
quickSort(arr, 0, i - 1);// 排基准数的左边
quickSort(arr, j + 1, right);// 排基准数的右边


...全文
555 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liketang_vip11 2016-10-10
  • 打赏
  • 举报
回复
测试测试测试测试
sky_08_06_02 2016-10-10
  • 打赏
  • 举报
回复
pan__yy 2016-10-09
  • 打赏
  • 举报
回复
必须是left和right啊,两边不可能会一直是0和length-1的。试想一下,第一次排序分成两边(设为a和b),b的坐左边是left,不是0,a的左边才是0!
枣园小文文 2016-10-05
  • 打赏
  • 举报
回复
人呢,有知道的不

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧