我的代码在编译期间正在运行,但运行时错误指向我的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);
}
}
}
答案 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);
}
i
是n/2
所以传递功能:
MAX_heapify(A,n/2);
和r
为2 * (n/2) + 1
,n+1
当你想要这一行时
if (A[r] > A[largest] && r <= heapsize) {
然后A[r]
为A[n+1]=A[A.length+1]
- 这会导致IndexOutOfBoundsException