我正在编写一个快速排序程序,以100000的输入大小运行。我已经尝试以500的大小运行它并且工作正常但是有数百万输入,程序中断了以下错误代码
“java.lang.StackOverflowError”
有人可以帮我解决这个问题吗?我很确定我没有陷入无限递归。有一个基本情况应该导致递归方法返回。
public class count_comparisons {
public static int count_comp =0;
public static int partitioning(int[] A, int lo, int hi) {
int pivot = A[lo];
int i=lo+1;
int j=lo+1;
int k=lo;
for ( j=lo+1;j<=hi;j++) {
if (A[j] < pivot) {
swap(A,i,j);
i++;
}
}
swap(A,i-1,lo);
return i-1;
}
public static int quicksort(int[] A, int lo, int hi) {
if (lo>=hi) return 0;
int pivot = partitioning(A,lo,hi);
//StdOut.println("Pivot index is "+ pivot +" and entry at pivot is " + A[pivot]);
StdOut.println("Lo is "+ lo +" and Hi is " + hi);
int h = quicksort(A,lo,pivot-1);
int m = quicksort(A,pivot+1,hi);
//StdOut.println("First half count is "+h);
//StdOut.println("Second half count is "+m);
count_comp = count_comp + h + m;
return (hi-lo);
}
public static void quicksort(int[] A,int N) {
int k = quicksort(A,0,N-1);
count_comp = count_comp + k;
//StdOut.println(" First count is "+k);
}
private static void swap(int[] A, int j,int k) {
int temp = A[j];
A[j] = A[k];
A[k] = temp;
}
public static void main(String[] args) {
In in = new In("input_file.txt");
int N=569;
int[] A = new int[569];
int i=0;
while (!in.isEmpty()) {
A[i++] = in.readInt();
}
count_comparisons.quicksort(A,N);
for( int h=0;h<N;h++) {}
//StdOut.print(A[h]);
StdOut.println();
StdOut.println(count_comparisons.count_comp);
}
}
答案 0 :(得分:2)
递归不需要是无限的,以便导致堆栈溢出:所有它需要它足够长以溢出堆栈。
Quicksort可能会非常缓慢:在一些特别不幸的情况下,n-1
可能需要O(n^2)
次调用,因为{{1}}表现最差。
您有两种选择 - 通过使用显式堆栈数据结构重写代码而不递归,或者通过增加JVM分配给程序线程的堆栈大小。
答案 1 :(得分:0)
有一个尾递归消除技巧,只递归到较小的子集中,这限制了递归深度。