Java 执行dualPivotQuickSort时发生堆栈溢出错误
我正在使用下面链接的dualPivotQuickSort算法。在数组大小具有100.000索引之前,一切正常。当我设置大小100.000并在数组中增加或减少数字时,我的程序崩溃并出现StackOverflow错误。使用随机数时没有问题,即使是长度为100.000的数组。Java 执行dualPivotQuickSort时发生堆栈溢出错误,java,sorting,runtime-error,stack-overflow,quicksort,Java,Sorting,Runtime Error,Stack Overflow,Quicksort,我正在使用下面链接的dualPivotQuickSort算法。在数组大小具有100.000索引之前,一切正常。当我设置大小100.000并在数组中增加或减少数字时,我的程序崩溃并出现StackOverflow错误。使用随机数时没有问题,即使是长度为100.000的数组。 void排序(int[]A,int左,int右){ 如果(右>左){ //选择最外面的图元作为轴 如果(A[左]>A[右])交换(A,左,右); int p=A[左],q=A[右]; //根据下面的不变量划分A int l=左
void排序(int[]A,int左,int右){
如果(右>左){
//选择最外面的图元作为轴
如果(A[左]>A[右])交换(A,左,右);
int p=A[左],q=A[右];
//根据下面的不变量划分A
int l=左+1,g=右-1,k=l;
while(k=q){
而(A[g]>q&k
调试您的程序。对于堆栈溢出错误,最好的方法是添加一个print语句来打印每个递归方法调用的参数值。当错误发生时,最后几行将显示导致太深递归的模式。所以添加System.out.println(左+”,“+右)在这种情况下,您可能会发现数据太多,堆栈的有限大小无法处理所需的递归次数。这就是为什么你通常从不使用最外面的元素作为支点的原因。谢谢你的回答,我会试试你的命令,但我还是有一个问题。当我让我的朋友运行那个算法时,它运行得很好。我的电脑出了什么问题:)我不知道。可能是不同版本的Java,所以默认堆栈大小不同?好吧,那么,也许我可以尝试更改堆栈大小。据我所知,堆栈大小与您正在使用的操作系统有关。
void sort(int[] A, int left, int right) {
if (right > left) {
// Choose outermost elements as pivots
if (A[left] > A[right]) swap(A, left, right);
int p = A[left], q = A[right];
// Partition A according to invariant below
int l = left + 1, g = right - 1, k = l;
while (k <= g) {
if (A[k] < p) {
swap(A, k, l);
++l;
} else if (A[k] >= q) {
while (A[g] > q && k < g) --g;
swap(A, k, g);
--g;
if (A[k] < p) {
swap(A, k, l);
++l;
}
}
++k;
}
--l; ++g;
// Swap pivots to final place
swap(A, left, l); swap(A, right, g);
// Recursively sort partitions
sort(A, left, l - 1);
sort(A, l + 1, g - 1);
sort(A, g + 1, right);
}
}
void swap(int[] A, int i, int j) {
final int tmp = A[i]; A[i] = A[j]; A[j] = tmp;
}