繁体   English   中英

Java:Mergesort stackoverflow错误

[英]Java: Mergesort stackoverflow error

我已经在Java中创建了一个自上而下的Mergesort实现,但是出现了StackOverFlow错误,我无法调试。 有线索吗?

/**
* Merge Sort
*
* Implementation in based on the concepts according to CLRS
*/
import java.util.Arrays;
import java.io.*;

    class mergesort{

      static int A[] = {23,45,10,2,78,32,89,90,1,64};

      static int B[] = new int[A.length]; 

      public static void main(String args[]) throws IOException{

    //     Set up output to a file
        PrintStream ps = new PrintStream(new FileOutputStream("out.txt"));
        PrintStream pserr = new PrintStream(new FileOutputStream("err.txt"));
        System.setOut(ps);
        System.setErr(pserr);

        MERGE_SORT(A,0,9);

        // print sorted array
        for(int i=0;i<=9;i++){
          System.out.print(Integer.toString(B[i])+" ");
        }
      }

      /**
       * Function to merge two sorted arrays
       */
      private static void MERGE(int A[],int p,int q,int r){
        // variables
        int lLimit,rLimit,lp,rp,k;

        // initialize variables
        lp=0;rp=0;k=0;

        // find number of elements in left and right arrays
        lLimit = q-p+1;
        rLimit = r-q;

        // create lists
        int L[] = new int[lLimit];
        int R[] = new int[rLimit];
        for(int i=0;i<lLimit;i++){
          L[i] = A[i];
        }
        for(int i=0;i<rLimit;i++){
          R[i] = A[i+lLimit];
        }

        // sort individual lists
        for(int i=0;i<=r;i++){       // runs r times
          if(lp>lLimit-1 || rp>rLimit-1) return;   // to handle ArrayIndexOutOfBounds
          if(L[lp] < R[rp]){
            // copy L[lp] to A[k];
            A[k] = L[lp];
            lp++;                    // this step could lead to ArrayIndexOutOfBounds error on next check for lp
          }else{
            A[k] = R[rp];
            rp++;                    // this step could lead to ArrayIndexOutOfBounds error on next check for rp
          }
          // increment array A's pointer k
          k++;
        }
      }

      /**
       * Following procedure will result in the creation of individual sorted items
       */
      private static void MERGE_SORT(int A[],int p,int r){
          if(p<r){
            int q = (r-p)/2;   // remember, r > p
            MERGE_SORT(A,p,q); 
            MERGE_SORT(A,q+1,r);
            MERGE(A,p,q,r);
          }
      }
    }

输出:

Exception in thread "main" java.lang.StackOverflowError
    at mergesort.MERGE_SORT(mergesort.java:77)
    at mergesort.MERGE_SORT(mergesort.java:78)
    at mergesort.MERGE_SORT(mergesort.java:78)
    at mergesort.MERGE_SORT(mergesort.java:78)
    at mergesort.MERGE_SORT(mergesort.java:78)
    at mergesort.MERGE_SORT(mergesort.java:78)
    at mergesort.MERGE_SORT(mergesort.java:78)
    at mergesort.MERGE_SORT(mergesort.java:78)
    at mergesort.MERGE_SORT(mergesort.java:78)
......

您没有在MERGE_SORT方法中正确计算范围的中间值。

int q = (r-p)/2;

应该

int q = (r+p)/2;

除了这个问题,您的MERGE方法也有问题。 您错误地初始化LR数组。 应该为L数组分配从输入数组的pq索引的值(而不是从0到qp )。 应该为R数组分配从输入数组的q+1r索引的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM