我正在做一个简单的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)


 }

关于java - 带有MergeSort的数组OutOfBounds异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33629894/

10-11 22:06