数组索引越界异常合并排序过程Java

Array Index Out of Bounds Exception Merge Sort Procedure 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 

第51行需要 for(int k=0;k<r-1;k++) 这让它对我有用

我做了一些改动,将左右两个数组合并到一个已排序的数组中 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;
   }
}

首先错误的是分配给左右数组以临时保存的数组大小。

我对您的代码进行了一些修改以使其工作。给你:

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;
 }
}