2016-11-26 2 views
0

Я реализовал эту процедуру сортировки слиянием, но это исключение из пределов исключения, и я не могу понять, почему это делается, поэтому я проверил все параметры массива, но он все еще имеет проблема.Индекс массива из границ Процедура сортировки слияния исключения Java

public class MergeSort 
    { 
    public static void main(String[] args) throws ArrayIndexOutOfBoundsException 
     { 

     int a[]={2,4,5,7,1,2,3,6}; 

     System.out.println("Unsorted Array"); 
     for(int i=0;i<a.length;i++) 
      { 
      System.out.print(a[i]+" "); 
      } 
     try{ 
     MergeSort m=new MergeSort(); 
     a=m.merge(a, 0, 3, 7); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     System.out.println("\nSorted Array"); 
     for(int i=0;i<a.length;i++) 
      { 
      System.out.print(a[i]+" "); 
      } 


     } 

    int [] merge(int a[],int p,int q,int r) 
     { 
     //int a[]={2,4,5,7,1,2,3,6}; 
     int n1=r-p+1; 
     int n2=r-q; 

     int L[]=new int[n1+1]; 
     int R[]=new int[n2+1]; 



     for(int i=0;i<n1;i++) 
     { 
      L[i]=a[i]; 
     } 
     q=q+1; 
     for(int i=0;i<n2-1;i++) 
     { 
      R[i]=a[q+i]; 
     } 

     //L[n1+1]=9; 
     ///R[n2+1]=9; 

     int i=0,j=0; 

     for(int k=0;k<r;k++) 
     { 
      if(L[i]<=R[j]) 
      { 
       a[k]=L[i]; 
       i++; 
      } 
      else 
      { 
       a[k]=R[j]; 
       j++; 
      } 
     } 




     return a; 
     } 
    } 
Unsorted Array 
2 4 5 7 1 2 3 6 java.lang.ArrayIndexOutOfBoundsException: 5 
    at scom.id.MergeSort.merge(MergeSort.java:63) 
    at scom.id.MergeSort.main(MergeSort.java:20) 

Sorted Array 
1 2 2 3 0 0 3 6 
+0

Какое точное сообщение об ошибке и какая строка вызывает его? Измените вопрос и покажите нам полную stacktrace, и поскольку мы не можем видеть номера строк, сообщите нам, какая строка это. – Andreas

+0

Это поможет, если ваше форматирование будет согласованным. – byxor

+0

@JamesKPolk Пожалуйста, не применяйте * свой * стиль персонального кода к другим вопросам/ответам других людей. Стиль кода OP должен был иметь '{' на отдельных строках. Это совершенно правильный стиль кода. Отменить редактирование. – Andreas

ответ

1

Я внесла некоторые изменения в ваш код, чтобы заставить его работать. Здесь у вас есть:

public class MergeSort { 
    public static void main(String[] args) throws ArrayIndexOutOfBoundsException{ 

    int a[]={2,4,5,7,1,2,3,6}; 

    System.out.println("Unsorted Array"); 
    for(int i=0;i<a.length;i++){ 
     System.out.print(a[i]+" "); 
    } 
    try{ 
     MergeSort m=new MergeSort(); 
     a=m.merge(a, 0, 3, 7); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    System.out.println("\nSorted Array"); 
    for(int i=0;i<a.length;i++){ 
     System.out.print(a[i]+" "); 
    } 
    } 

    int [] merge(int a[],int p,int q,int r){ 
    //int a[]={2,4,5,7,1,2,3,6}; 
    int n1=q-p+2; 
    int n2=r-q+1; 

    int L[]=new int[n1]; 
    int R[]=new int[n2]; 

    for(int i=0;i<n1 -1;i++){ 
    L[i]=a[p+i]; 
    } 
    L[n1 -1] = Integer.MAX_VALUE; 
    //q=q+1; 
    for(int i=0;i<n2 -1;i++){ 
    R[i]=a[q+i+1]; 
    } 
    R[n2-1] = Integer.MAX_VALUE; 

    //L[n1+1]=9; 
    ///R[n2+1]=9; 

    int i=0,j=0; 

    for(int k = p; k <= r; k++){ 
     if(L[i] <= R[j]){ 
     a[k] = L[i++]; 
    }else{ 
     a[k] = R[j++]; 
    } 
    } 
    return a; 
} 
} 
+0

7 отсутствует в результате. –

+0

Извините, я обновил код. – user2751809

+0

Большое спасибо. –

0

линии 51 должен быть for(int k=0;k<r-1;k++) , что получил его на работу для меня

+1

Действительно? Unsorted Array: '2 4 5 7 1 2 3 6', Sorted Array:' 1 2 2 3 0 0 3 6'. Это * «работает для вас» *? Потому что это точно не похоже на правильный вывод для меня. – Andreas

+0

Исходный вопрос: ошибка была выбрана – Austin

+0

@Austin, но ее также нужно сортировать, есть ли что-то не так с алгоритмом слияния, который я использую. –

0

Я несколько изменений для объединения двух левых и правых массивов в одном массиве из отсортированного element.Here является решение, которое работает должным образом. Надеюсь, это поможет вам понять, что происходит не так.

public class MergeSort { 
public static void main(String[] args) throws ArrayIndexOutOfBoundsException { 

    int a[] = {2, 4, 5, 7, 1, 2, 3, 6}; 
    System.out.println("Unsorted Array"); 
    for (int i = 0; i < a.length; i++) { 
     System.out.print(a[i] + " "); 
    } 
    MergeSort m = new MergeSort(); 
    a = m.merge(a, 0, 3, 7); 
    System.out.println("\nSorted Array"); 
    for (int i = 0; i < a.length; i++) { 
     System.out.print(a[i] + " "); 
    } 
} 

int[] merge(int a[], int p, int q, int r) { 
    //int a[]={2,4,5,7,1,2,3,6}; 
    int n1 = q - p + 1; 
    int n2 = r - q; 

    int L[] = new int[n1]; 
    int R[] = new int[n2]; 


    for (int i = 0; i < n1; i++) { 
     L[i] = a[i]; 
    } 
    for (int i = 0; i < n2; i++) { 
     R[i] = a[q + i + 1]; 
    } 

    //L[n1+1]=9; 
    ///R[n2+1]=9; 

    int i = 0, j = 0 , k = 0; 

    while (i < n1 && j < n2) { 
     if (L[i] <= R[j]) { 
      a[k] = L[i]; 
      i++; 
     } 
     else { 
      a[k] = R[j]; 
      j++; 
     } 
     k++; 
    } 

    while (i < n1) { 
     a[k] = L[i]; 
     i++; 
     k++; 
    } 

    while (j < n2) { 
     a[k] = R[j]; 
     j++; 
     k++; 
    } 

    return a; 
    } 
} 

Первое, что неправильно, это размеры массива, которые выделяются для левого и правого массива для временного хранения.

+0

ваше решение работает нормально, но то, что не так с моим кодом, является моей главной задачей. –

+0

Итак, первое, что – swapnil

+0

1. n1 размер неправильный. – swapnil