2012-02-12 5 views
1

Я работаю над домашним заданием, где мне нужно реализовать MergeSort на основе автора наших psuedo-кода. (Основы алгоритмов, 4-е изд. Неаполитан и Наймипур).Arraycopy Crashing My Program

Из основного метода, который я называю 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); 
    } 

EDIT: Я понял, что у меня было несколько небольших ошибок в слиянии. Самыми большими изменениями были изменение сравнений с работой с равными, а также понимание длины в 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

+1

Также пометьте его домашним заданием, чтобы мы не дали полного решения :). Удачи! –

ответ

3

Протестировано. Это как IndexOutOfBounds. Причина в том, что длина, которую вы даете в ArrayCopy, больше, чем счетчик вашего исходного массива.

+2

+1 для отправки полного предложения! –