2016-11-26 54 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

什麼是確切的錯誤信息,是什麼原因造成的?編輯問題並向我們展示完整的堆棧跟蹤,並且由於我們無法看到行號,請告訴我們它是哪一行。 – 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

真的嗎?未分類數組:「2 4 5 7 1 2 3 6」,分類數組:「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