Arraycopy破坏了我的程序

时间:2012-02-12 21:55:55

标签: java recursion mergesort arraycopy

我正在完成一项家庭作业,我必须根据我们的书籍psuedo-code的作者实现一个MergeSort。 (算法基础,由Neapolitan和Naimipour编写的第4版)。

从main方法我调用mergeSort,int n是数组的长度,S []是需要排序的数组。 S []已经填充了1到999之间的随机数。我的程序在合并的最后一个arraycopy中崩溃,我不知道它为什么,我已经尝试在netbeans中调试。我觉得这可能是一个我无法看到的愚蠢错误。任何帮助都会很棒。谢谢你提前。

public static void mergesort (int n, int S[])
   {
      if(n>1){
         final int h=n/2, m=n-h;
         int U[] = new int[h];
         int V[] = new int[m];
         System.arraycopy(S, 0, U, 0, h);
         System.arraycopy(S, h, V, 0, m);
         mergesort(h, U);
         mergesort(m, V);
         merge(h, m, U, V, S);
      }
   }
   public static void merge(int h, int m, final int U[], final int V[], final int S[])
   {
      int i=0, j=0, k=0;
      while(i<h && j<m){
         if(U[i]<V[j]) {
            S[k] = U[i];
            i++;
         }
         else {
            S[k]=V[j];
            j++;
         }
         k++;
      }
      if(i>h)
         System.arraycopy(V, j, S, k, h+m);
      else
         System.arraycopy(U, i, S, k, h+m);
   }
编辑:我意识到我在合并时遇到了一些小错误。最大的变化是改变了与equals一起工作的比较,并且理解arraycopy中的长度是我想要复制的元素数量。这是我的合并方法。 mergesort保持不变。

   public static void merge(int h, int m, final int U[], final int V[], int S[])
   {
      int i=0, j=0, k=0;
      while(i<h && j<m){
         if(U[i]<V[j]) {
            S[k] = U[i];
            i++;
         }
         else {
            S[k]=V[j];
            j++;
         }
         k++;
      }
      if(i>=h)
         System.arraycopy(V, j, S, k, m-j);
      else
         System.arraycopy(U, i, S, k, h-i);
   }

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

测试过它。它作为IndexOutOfBounds。 原因是您在ArrayCopy中提供的长度大于源数组的计数。