[英]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);
}
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.