Java中的堆栈溢出错误
我试图编写一个程序,使用递归和类似快速排序的分区查找第k个最小元素,这样就不必对整个数组进行排序。我觉得我的代码应该可以工作,但是当调用函数时,我会立即出现堆栈溢出错误,因此我无法测试它 我认为堆栈溢出与执行堆栈溢出有关,我理解它是在递归中发生的,但是错误在函数的第一行被调用,所以我很困惑。如果有人能看看这个,并提出一些建议,我会非常感激。谢谢Java中的堆栈溢出错误,java,sorting,recursion,stack-overflow,Java,Sorting,Recursion,Stack Overflow,我试图编写一个程序,使用递归和类似快速排序的分区查找第k个最小元素,这样就不必对整个数组进行排序。我觉得我的代码应该可以工作,但是当调用函数时,我会立即出现堆栈溢出错误,因此我无法测试它 我认为堆栈溢出与执行堆栈溢出有关,我理解它是在递归中发生的,但是错误在函数的第一行被调用,所以我很困惑。如果有人能看看这个,并提出一些建议,我会非常感激。谢谢 public static int find_kth_smallest( int[] A, int n, int k ) { int[] Le
public static int find_kth_smallest( int[] A, int n, int k )
{
int[] Left = new int[200];
int[] Right = new int[200];
int half = n/2;
int x = 0; int j = half + 1; int q = 0;
int count = 0;
int pivot = A[half];
for(int i = 0; i < n; i++)
{
if(A[i] < pivot)
{
Left[x] = A[i];
x++;
}
if(A[i] > pivot)
{
Right[j] = A[i];
j++;
}
}
while(Left[q] != 0)
q++;
if(k < q)
{
return find_kth_smallest(Left, q, k);
}
if(k > q)
{
return find_kth_smallest(Right, n-q, k);
}
if(k-1 == q)
{
return A[pivot];
}
return -1;
public static int find_kth_最小(int[]A,int n,int k)
{
int[]左=新int[200];
int[]右=新int[200];
int-half=n/2;
int x=0;int j=一半+1;int q=0;
整数计数=0;
int pivot=A[半];
对于(int i=0;ipivot)
{
右[j]=A[i];
j++;
}
}
while(左[q]!=0)
q++;
if(kq)
{
返回find_kth_minimate(右,n-q,k);
}
if(k-1==q)
{
返回一个[枢轴];
}
返回-1;
您的错误是j
应该从0
开始,而不是从half+1
开始。目前,您正在将轴上方的数组部分复制到Right
的上半部分。如果您遵循递归的右侧,则可以保证轴将永远保持等于0e> 在这一点之后,您将永远不会停止递归
此外,这里还有其他几个问题:
- 您假设
A
的任何元素都不等于0
,这是一个危险的假设
- 您使用的是fixed
int[200]
。这是Java;您可以在运行时分配这些东西。只需根据n
适当调整Right
和Left
的大小。现在,如果A
的大小大于等于400,您的程序就会失败
当然
if(k-1 == q)
{
永远不会是真的,就像
if(k > q)
{
屏蔽它。你作为参数传递给函数的值是什么?不清楚你是如何调试的。只要进入这个方法就不会引起问题……如果它是递归的,它会在第一行消失。只是它不是第一次在第一行,它递归了很多次,以至于它的堆栈用完了错误可能发生在第一行,但可能不是执行的第一行。您正在使用递归,因此第一行可能会被多次调用。请通过调试程序来验证您的逻辑。@keith+1。在靠近顶部的函数中添加某种打印语句。您将看到打印输出多次出现。