对于以下快速排序算法:

import java.util.Scanner;
import java.util.ArrayList;
public class quick_sort_demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> my_arr = new ArrayList<Integer>();
        while (true) {
            System.out.println("Enter input value. '-1' to exit the adding process. ");
            int val = sc.nextInt();
            sc.nextLine();
            if (val == -1) {
                break;
            } else {
                my_arr.add(val);
            }
        }
        quick_sort(my_arr);
    }
    public static ArrayList<Integer> quick_sort(ArrayList<Integer> arr) {
        if (arr.size() <= 1) {
            return arr;
        }
        int pivot_index = (int) (Math.random() * arr.size());
        int pivot = arr.get(pivot_index);
        ArrayList<Integer> left_arr = new ArrayList<Integer>();
        ArrayList<Integer> right_arr = new ArrayList<Integer>();
        for (int i = 0; i < arr.size(); i++) {
            int element = arr.get(i);
            if (element > pivot) {
                right_arr.add(element);
            } else {
                left_arr.add(element);
            }
        }
        left_arr = quick_sort(left_arr);
        right_arr = quick_sort(right_arr);
        ArrayList<Integer> result = new ArrayList<Integer>();
        result.addAll(left_arr);
        result.add(pivot);
        result.addAll(right_arr);
        return result;
    }
}

我反复收到此错误:

Exception in thread "main" java.lang.StackOverflowError
        at java.base/java.util.Random.next(Random.java:209)
        at java.base/java.util.Random.nextDouble(Random.java:463)
        at java.base/java.lang.Math.random(Math.java:865)
        at quick_sort_demo.quick_sort(quick_sort_demo.java:23)
        at quick_sort_demo.quick_sort(quick_sort_demo.java:35)

我对程序的具体输入如下:{6,15,32,643,6543,534232,232,-1}

我试着询问CHATGPT,但对于我遇到的特定错误,我无法得到有用的答案.我不明白为什么我会收到一个堆栈溢出错误,因为递归方法应该会毫无问题地调用自己,直到‘arr.size()’返回某个值&lt;=1.有人能解释一下我做错了什么吗?我的算法是错误的吗?为什么我会得到一个递归错误?

推荐答案

代码运行良好

好吧,almost好吧,你的代码里有个错误

left_arr = quick_sort(left_arr);
right_arr = quick_sort(right_arr);
ArrayList<Integer> result = new ArrayList<Integer>();
result.addAll(left_arr);
result.add(pivot); //BUG HERE
result.addAll(right_arr);

当你向左/向右分开时,你已经把你的pivot加到了left_arr中-所以没有必要再加两次,因为

if (element > pivot) {
    right_arr.add(element);
} else {
    left_arr.add(element); //pivot itself is NOT bigger than pivot and will be added here
}

或者,您可以从列表中 Select remove个轴心点:int pivot = arr.remove(pivot_index);

关于java.lang.StackOverflow Error

嗯-你的代码在我的机器上运行得很好,所以我猜你必须正确地设置你的计算机-查看this answer了解更多详细信息(对于这个仅有链接的答案很抱歉)

Java相关问答推荐

如何用javac编译Java类,即使对像java.lang.*这样的基本类也没有任何依赖关系?

多个Java线程和TreeMap.put()的非预期行为

XPages-在第二次点击按钮之前延迟

扩展到弹出窗口宽度的JavaFX文本字段

使用REST客户端和对象映射器从字符串反序列化Json

使用Mockito进行的Junit测试失败

如何获取Instant#of EpochSecond(?)的最大值

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

@Rollback @ Transmission在验收测试中不工作

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

Log4j与jdk21兼容吗?

没有使用Lombok生成的参数

错误:未找到扩展元素在JBossEAP 7.2中安装FUSE时出错

X=x*0.90;产生有损转换误差.X*=0.90;不是.为什么?

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

没有Tomcat,IntelliJ如何在本地运行API?

如何在右击时 Select 新行?

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持