2012-02-12 38 views
1

我正在做一個家庭作業,我必須根據我們的書籍psuedo-code的作者實現MergeSort。 (Foundations of Algorithms,第4版,由Neapolitan和Naimipour)。Arraycopy崩潰我的程序

從主要方法我調用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); 
    } 

編輯:我意識到我在合併中有幾個小錯誤。最大的變化是改變比較以等於工作,也理解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); 
    } 

感謝您的幫助。

+3

發佈stacktrace(Exception.printStacktrace())。它可能是一個堆棧溢出,內存不足或索引超出範圍...... – KarlP 2012-02-12 22:04:11

+1

另外,標記它與家庭作業,以便我們不給完整的解決方案:)。祝你好運! – 2012-02-12 22:22:44

回答

3

經過測試。它作爲IndexOutOfBounds。 原因是您在ArrayCopy中給出的長度大於源數組的計數。

+2

+1無法發佈完整的解決方案! – 2012-02-12 22:21:58