Arraycopy Crashing My Program

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

Из основного метода я вызываю mergeSort, где int n - это длина массива, а S[] - массив, который нужно отсортировать. S[] уже заполнен случайными числами от 1 до 999. Моя программа падает при последней копии массива в слиянии, и я не уверен, почему это так, и я попытался отладить в 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);
   }

РЕДАКТИРОВАТЬ: я понял, что у меня была пара небольших ошибок в слиянии. Самыми большими изменениями были изменения сравнений для работы с равными, а также понимание длины в массиве копий - это количество элементов, которые я хочу скопировать. Вот мой метод слияния. 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 ответ

Решение

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

Другие вопросы по тегам