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