我试图编写一个程序,使用递归找到第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;
答案 0 :(得分:0)
您的错误是j
应该从0
开始,而不是half+1
。目前,您正在将数组中位于枢轴上方的部分复制到Right
的上半部分。如果您遵循递归的右侧,则保证在该点之后枢轴将永远保持等于0
,因此您永远不会停止递归。
此外,还有其他一些问题:
A
的任何元素都不等于0
,这是一个危险的假设。int[200]
。这是Java;你可以在运行时分配这些东西。只需根据Right
调整Left
和n
的大小。现在,对于每个大小为400或更大的A
,您的程序将会失败。答案 1 :(得分:0)
当然
if(k-1 == q)
{
永远不会成真,
if(k > q)
{
屏蔽它。