MergeSort 的数组 OutOfBounds 异常

Array OutOfBounds Exception with MergeSort

我正在做一个简单的 MergeSort 实现,将其作为伪代码。为此,我使用 Java 泛型。但是我在第一个 for 循环的最后一个元素上得到了这样的异常。我已经做了一些改变(希望更好),但仍然不可避免地会出现这个。为什么会这样?

private Comparable[] mergesort(Comparable[] elements, int l, int r) {
    if(l < r){
        int m = (l + r - 1)/2;
        mergesort(elements, l, m);
        mergesort(elements, m + 1, r);
        int i = l;
        int j = m + 1;
        int k = l;
        Comparable[] elements1 = (Comparable[])new Comparable[l + r]; //changed from [l + r - 1] and in the function caller also mergesort(elements, elements.length - elements.length, elements.length - 1)
        while(i <= m && j <= r){
            if(elements[i].compareTo(elements[j]) <= 0 ){ 
                elements1[k] = elements[i];
                i++;
            } else {
                elements1[k] = elements[j];
                j++;
            }
            k++;  
        }
        for(int h = i; i <= m; h++){
            elements[k + (h - i)] = elements[h];
            //ArrayIndexOutOfBoundsException: 4(the length of the input array)
        }
        for(int h = j; h <= k - 1; h++){
            elements[h] = elements1[h];
        }
    }
    return elements;
}

虽然您的代码难以阅读,但我认为您正在比较错误的值。

  for(int h = i; i <= m; h++){
                 ^
                should be h
                elements[k + (h - i)] = elements[h];
                //ArrayIndexOutOfBoundsException: 4(the length of the input array)


 }

您使用:

for(int h = i; i <= m; h++) {
    elements[k + (h - i)] = elements[h];
}

你总是增加 h 但比较 i <= m。因为你永远不会改变 i 你有一个无限循环。