Java HeapSort代码snipplet给出索引越界异常

Java HeapSort代码snipplet给出索引越界异常,java,indexoutofboundsexception,heapsort,Java,Indexoutofboundsexception,Heapsort,我正在为堆排序尝试以下代码,该代码给出ArrayIndexOutOfBoundsException异常: package com.排序; 导入java.util.array; 公共类堆{ 专用静态int-arr[]; 私有静态整数l,r,max,hsize; /** *@param args */ 公共静态void main(字符串[]args){ int[]数={55,2,93,1,23,10,66,12,7,54,3}; System.out.println(Arrays.toString(

我正在为堆排序尝试以下代码,该代码给出
ArrayIndexOutOfBoundsException
异常:

package com.排序;
导入java.util.array;
公共类堆{
专用静态int-arr[];
私有静态整数l,r,max,hsize;
/**
*@param args
*/
公共静态void main(字符串[]args){
int[]数={55,2,93,1,23,10,66,12,7,54,3};
System.out.println(Arrays.toString(numbers));
HeapSort(数字);
System.out.println(Arrays.toString(numbers));
}
私有静态无效堆端口(int myarr[]){
//TODO自动生成的方法存根
arr=myarr;
hsize=arr.length-1;
构建堆(arr);
对于(int i=hsize;i>0;i--)
{
交换(0,i);
西泽——;
满意度EAP(arr,0);
}       
}
私有静态void构建堆(int[]arr){
//TODO自动生成的方法存根
对于(int i=hsize/2;i>=0;i--)
{
满足EAP(arr,i);
}
}
私有静态无效满足EAP(int[]arr,int i){
//TODO自动生成的方法存根
l=2*i;
r=2*i+1;
if(larr[i])

//if(arr[l]>arr[i]&l简短回答

魔术被称为是专门为这种情况设计的

更长的答案

在Java和许多其他语言中,逻辑代码

if(条件1&&condition2){
做点什么
}
相当于

if(条件1){
如果(条件2){
做点什么
}
}
用“等价物”这里我的意思是,如果
condition2
是要计算的东西,那么如果
condition1
恰好是
false
,它就不会被计算。从布尔逻辑的角度来看,这也是正确的。这个技巧在两个方面很有用。首先,它通过跳过求值
calculation2
,来提高性能。其次,它是在您的WARE
condition1
condition2
的“保护条件”的情况下非常有用

另一个例子是function
isEmptyString
,它由许多Java开发人员以以下方式实现

公共静态布尔isEmptyString(字符串s){
返回(string==null)| |(string.length()==0);
}
如果没有短循环逻辑,如果
s
恰好为空,此表达式将引发
NullPointerException

您的具体案例(为什么要
ArrayIndexOutOfBoundsException

您的问题的另一点可能是“如何出现
ArrayIndexOutOfBoundsException
为了回答这个问题,考虑当第一个元素实际上是堆中最大的情况下,我们应该把它移到树的最后一层。这个向下运动是由你的< SatisfyHeap > <代码>实现的。现在假设我们上次交换了把最大的元素移到了底部。ed我们将再进行一次递归调用,在该调用中,出现异常


旁注,我要说的是,除非您预先分配
arr
大于实际堆大小,否则独立于
arr.length
存储
hsize
是一个坏主意,这会使代码更难理解。

下面给出一个错误


if(arr[l]>arr[i]&l@Tapan,如果你认为其中一些答案是有用的,你可以投票支持。如果有一个答案确实很适合你的问题,你可以将其标记为“接受”答案。