【问题标题】:Stack Overflow Error in JavaJava中的堆栈溢出错误
【发布时间】:2013-02-19 08:39:12
【问题描述】:

我正在尝试编写一个程序,该程序使用递归和快速排序(如分区)来查找第 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;

【问题讨论】:

  • 作为参数传递给函数的值是什么?
  • 不清楚你是如何调试的。只是步入该方法应该不会导致问题...
  • 如果它是递归的,它会死在第一行。只是它不是第一次在第一行,它递归了很多次,以至于它用完了堆栈
  • 错误可能发生在第一行,但它可能不是执行的第一行。您正在使用递归,因此可能会多次调用第一行。请通过调试程序验证您的逻辑。
  • @keith +1。在靠近顶部的函数中添加某种打印语句。你会看到打印输出出现了很多次。

标签: java sorting recursion stack-overflow


【解决方案1】:

您的错误是j 应该从0 开始,而不是half+1。目前,您将数组中枢轴上方的部分复制到Right 的上半部分。如果您遵循递归的右侧,则可以保证在该点之后枢轴将永远保持等于0,因此您将永远不会停止递归。

此外,这里还有其他几个问题:

  • 您假设A 的任何元素都不等于0,这是一个危险的假设。
  • 您使用的是固定的int[200]。这是Java;您可以在运行时分配这些东西。只需根据n 适当调整RightLeft 的大小即可。现在,您的程序对于大小为 400 或更大的每个 A 都会失败。

【讨论】:

    【解决方案2】:

    确实

    if(k-1 == q)
       {
    

    永远不会是真的,因为

    if(k > q)
       {
    

    保护它。

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2014-04-10
      • 2015-12-28
      相关资源
      最近更新 更多