Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的堆栈溢出错误_Java_Sorting_Recursion_Stack Overflow - Fatal编程技术网

Java中的堆栈溢出错误

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

我试图编写一个程序,使用递归和类似快速排序的分区查找第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;
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。在靠近顶部的函数中添加某种打印语句。您将看到打印输出多次出现。