Java 合并排序:此代码中的错误

Java 合并排序:此代码中的错误,java,algorithm,sorting,Java,Algorithm,Sorting,当我尝试运行此代码时,会出现索引越界异常 我们正在使用左右两个不同的数组进行合并 使用递归合并排序将数组划分为多个元素并合并它们 以下是我正在使用的CLRS算法: Merge(A, p, q, r) n1 ← q - p + 1 n2 ← r - q create arrays L[1..n1 + 1] and R[1..n2 + 1] for i ← 1 to n1 do L[i] ← A[p + i - 1] for j ← 1 to

当我尝试运行此代码时,会出现索引越界异常

我们正在使用左右两个不同的数组进行合并

使用递归合并排序将数组划分为多个元素并合并它们

以下是我正在使用的CLRS算法:

    Merge(A, p, q, r)
    n1 ← q - p + 1
    n2 ← r - q
    create arrays L[1..n1 + 1] and R[1..n2 + 1]
    for i ← 1 to n1
    do L[i] ← A[p + i - 1]
    for j ← 1 to n2
      do R[j] ← A[q + j]
    L[n1 + 1] ← ∞
    L[n2 + 1] ← ∞
    i ← 1
    j ← 1
    for k ≤ p to r
        do if L[i] ≤ R[j]
          then A[k] ← L[i]
             i ← i + 1
          else A[k] ← R[j]
              j ← j + 1

     MergeSort(A, p, r)
     if p < r
      then q ← ⌊(p + r)/2⌋
       MergeSort(A, p, q)
       MergeSort(A, q + 1, r)
       Merge(A, p, q, r)
代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class MergeSort {
   public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
      System.out.println("Enter the size of array to be sorted");
      int size = input.nextInt();
      int[] A = new int[size];
      System.out.println("Enter the elements of array");
      for (int i = 0; i < A.length; i++) {
         A[i] = input.nextInt();
      }
      System.out.println("The UNSORTED array elements are" + Arrays.toString(A));
      int p = 0, r = size;
      mergeSort(A, p, r);
      System.out.println("The SORTED array elements are" + Arrays.toString(A));
   }

   public static void mergeSort(int[] A, int p, int r) {
      if (p < r) {
         int q = (p + r) / 2;
         mergeSort(A, p, q);
         mergeSort(A, q + 1, r);
         merge(A, p, q, r);
      }
   }

   public static void merge(int[] A, int p, int q, int r) {
      int n1 = q - p + 1;
      int n2 = r - q;
      int[] L = new int[n1 + 1];
      int[] R = new int[n2 + 1];
      L[n1] = Integer.MAX_VALUE;
      R[n2] = Integer.MAX_VALUE;
      for (int i = 0; i < n1; i++) {
         L[i] = A[p + i];
      }
      for (int j = 0; j < n2; j++) {
         R[j] = A[q + j + 1];
      }
      int x = 0, y = 0;
      for (int k = p; k < r; k++) {
         if (L[x] <= R[y]) {
            A[k] = L[x];
            x++;
         } else {
            A[k] = R[y];
            y++;
         }
      }
   }
}

再看一眼,算法的实现似乎是正确的,我对输入参数感到困惑,因为它们不适合基于零的实现。所以也许你不想这样称呼它:

int p = 0, r = size;
mergeSort(A, p, r);
int p = 0, r = size - 1;
mergeSort(A, p, r);
而是像这样:

int p = 0, r = size;
mergeSort(A, p, r);
int p = 0, r = size - 1;
mergeSort(A, p, r);

为了完整性,在甘道夫建议的更改之后,在合并方法中for循环应该包含r的值,因此通过替换

for (int k = p; k < r; k++) {


您的实现对数组进行了正确排序。

User println语句在引发异常之前检查变量的状态。特别是检查数组A的长度,以及组成数组索引的所有变量的值。也许你至少可以告诉我们哪一行得到了异常,但是仅仅把你的整个赋值交给别人去做,在这样的情况下,或者在我能想到的任何地方,都不太可能得到别人的青睐。网上有很多工作实例。这不是一个作业。。。我不上学。这只是一个我没注意到的小错误。。正如@Gandalf所指出的