[英]Stack Overflow Error in Java
我正在尝试编写一个程序,该程序使用递归和分区之类的快速排序来找到第k个最小的元素,从而不必对整个数组进行排序。 我觉得我的代码应该可以工作,但是调用该函数后,我立即收到堆栈溢出错误,因此无法对其进行测试。
我以为堆栈溢出与执行堆栈溢出有关,并且我知道它是通过递归发生的,但是该错误在函数的第一行被调用,这让我感到困惑。 如果有人可以看一下并提出一些建议,我将不胜感激。 谢谢。
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;
您的错误是j
应该从0
开始,而不是half+1
。 当前,您正在将数组中枢轴上方的部分复制到Right
的上半部分。 如果您遵循递归的右侧,那么可以确保在该点之后,枢轴将永远保持等于0
,因此您将永远不会停止递归。
另外,这里还有其他一些问题:
A
任何元素都不等于0
,这是一个危险的假设。 int[200]
。 这是Java; 您可以在运行时分配这些东西。 只需根据n
适当调整Right
和Left
大小即可。 现在,对于每A
大于或等于400的A
,您的程序都会失败。 一定
if(k-1 == q)
{
永远不会是真的,因为
if(k > q)
{
屏蔽它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.