运行时期间Java堆程序错误

时间:2015-10-21 15:58:53

标签: java heapsort

我的代码在编译期间正在运行,但运行时错误指向我的MaxHeapify函数中的if条件。我把它标记出来了。任何帮助都会非常可爱,并且会让我不再将头撞在墙上。

public class HeapSort {

    public static void main(String[] args) {
        int A[] = {-100, 1, 2, 5, 7, 2, 9};
        Heapsort(A);
        //System.out.println(A.length);
        for (int x = 1; x < A.length; x++) {
            System.out.println(A[x] + " ");
        }
    }

    public static void Build_MAX_heap(int A[]) {
        int n = A.length;
        for (int i = n / 2; i >= 1; i--) {
            MAX_heapify(A, i);
        }
    }

    public static void MAX_heapify(int A[], int i) {
        int heapsize = A.length;
        int l = 2 * i;
        int r = 2 * i + 1;
        //find the largest of A[i].A[l],A[r]
        int largest = i;
        if (A[l] > A[largest]) {
            largest = l;
            if (A[l] > A[largest] && l <= heapsize) {
                largest = l;
            }
            if (A[r] > A[largest] && r <= heapsize) {     //runtime error here
                largest = r;
            }
            if (largest != i) {
                int temp = A[i];
                A[i] = A[largest];
                A[largest] = temp;
                MAX_heapify(A, largest);
            }
        }
    }

    public static void Heapsort(int A[]) {

        Build_MAX_heap(A);
        int heapsize = A.length;
        for (int last = heapsize; last >= 2; last--) {   
            int temp = A[1];
            A[1] = A[last];
            A[last] = temp;
            heapsize--;
            MAX_heapify(A,1);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

在检查索引{{1}处的元素之后,您在检查r(以及前一个语句中的l时,您正在检查... }。如果r超出范围,则表达式的前半部分将抛出异常,并且永远不会使其进入边界检查。

您的if语句应该是

r

这样您就可以在开始尝试访问阵列之前了解自己的情况。此外,由于数组是零索引的,因此if (r < heapsize && A[r] > A[largest]) ... 的索引不是有效的,因此heapsize需要小于,不小于或等于。

答案 1 :(得分:1)

你的问题是你在检查r是否超出范围之前检查A [r] 所以我会尝试以这种方式修改代码

 public class HeapSort {

public static void main(String[] args) {
    int A[] = {-100, 1, 2, 5, 7, 2, 9};
    Heapsort(A);
    //System.out.println(A.length);
    for (int x = 1; x < A.length; x++) {
        System.out.println(A[x] + " ");
    }
}

public static void Build_MAX_heap(int A[]) {
    int n = A.length;
    for (int i = n / 2; i >= 1; i--) {
        MAX_heapify(A, i);
    }
}

public static void MAX_heapify(int A[], int i) {
    int heapsize = A.length;
    int l = 2 * i;
    int r = 2 * i + 1;
    //find the largest of A[i].A[l],A[r]
    int largest = i;
    if (A[l] > A[largest]) {
        largest = l;
        if (A[l] > A[largest] && l <= heapsize) {
            largest = l;
        }
        if (r<=heapsize && A[r] > A[largest]) {     //modification here
            largest = r;
        }
        if (largest != i) {
            int temp = A[i];
            A[i] = A[largest];
            A[largest] = temp;
            MAX_heapify(A, largest);
        }
    }
}

public static void Heapsort(int A[]) {

    Build_MAX_heap(A);
    int heapsize = A.length;
    for (int last = heapsize; last >= 2; last--) {   
        int temp = A[1];
        A[1] = A[last];
        A[last] = temp;
        heapsize--;
        MAX_heapify(A,1);
    }
}

}

答案 2 :(得分:0)

变量r设置为:

int r = 2 * i + 1;

第一种情况是循环:

for (int i = n / 2; i >= 1; i--) {
    MAX_heapify(A, i);
}

in/2

所以传递功能:

MAX_heapify(A,n/2);

r2 * (n/2) + 1n+1

当你想要这一行时

if (A[r] > A[largest] && r <= heapsize) {

然后A[r]A[n+1]=A[A.length+1] - 这会导致IndexOutOfBoundsException