已解决:我在每次递归调用时都实例化一个新的 Random 对象。我把它作为一个静态变量放在 Quicksort 之外,现在它工作得很好。
我正在用 Java 编写 Quicksort 以完成学校作业,但我被卡住了。我正在使用类中的nextInt()
方法随机选择枢轴Random
。这意味着我正在调用nextInt()
每个递归步骤。我的快速排序在具有 20000 个元素的数组中完美地完成了这项工作。但是当我尝试对包含 40000 个元素的数组进行排序时,会StackOverflowError
出现这种情况
java.lang.StackOverflowError: null (in java.util.Random)
我已经在谷歌上搜索了这个错误,但对我没有任何帮助。我的猜测是我用完了随机整数,但我在 java 中太菜鸟了,我什至不买我自己的猜测。
这是我的代码(西班牙语是我的第一语言,对于蹩脚的英语和西班牙语代码感到抱歉)
public static void quicksort(String[] A, int min, int max){// llamar ord(A, 0, n-1);
if(min >= max){
return;
}
Random rand = new Random();
int pivote = particionar(A, min, max, rand);
quicksort(A, min, pivote-1);
quicksort(A, pivote + 1, max);
}
public static int particionar(String[] A, int min, int max, Random rand){
int menores = min + 1;
int mayores = max;
int pivote = rand.nextInt(max-min+1) + min;
String pivotstr = A[pivote];
//dejar pivote al principio
String aux = A[min];
A[min] = A[pivote];
A[pivote] = aux;
while(menores <= mayores){
if(A[menores].compareTo(pivotstr) <= 0){
menores++;
}
else{//intercambiar
String aux2 = A[menores];
A[menores] = A[mayores];
A[mayores] = aux2;
mayores--;
}
}
//mover pivote donde corresponde
String aux3 = A[min];
A[min] = A[mayores];
A[mayores] = aux3;
return mayores;
}