繁体   English   中英

运行时Java堆排序程序错误

[英]Java heapsort program error during runtime

我的代码在编译过程中正常工作,但运行时错误指向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);
        }
    }
}

检查索引r的元素 ,您正在对r (在上一条语句中也包括l进行边界检查。 如果r超出范围,则表达式的前半部分将引发异常,并且永远不会使其超出范围检查范围。

您的if语句应结构化

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

这样,在开始尝试访问阵列之前,您就知道自己已经陷入困境。 另外,由于数组的索引为零,所以heapsize大小的索引无效,因此r必须小于,不小于或等于。

您的问题是您在检查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);
    }
}

}

变量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) + 1 ,即n+1

当你想做这行

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM