我正在尝试创建一个堆排序类,我得到了这个错误
java.lang.ArrayIndexOutOfBoundsException
这是我的代码
package heap_sort; public class main { public static void main(String[] args) { int a[]={16,4,10,14,7,9,3,2,8,1}; heapsort(a); } public static void heapsort(int a[]) { build_max_heap(a); for(int i = a.length ;i<=2 ;i--) { a[1]=a[i]; max_heapify(a,1,i-1); } } public static void build_max_heap(int a[]) { int n=a.length; for (int i =n/2 ;i>=1 ;i--) { max_heapify(a,i,n); } } public static void max_heapify(int a[],int i , int n) { int L=i*2; int R=(i*2)+1; int Largest=i; if (L<=n && a[L] > a[i]) Largest=L; if (R>=n && a[R]>a[Largest]) { Largest=R; } if (Largest != i) Changing(a,i,Largest); max_heapify(a,Largest,n); } public static void Changing (int a[],int i,int LL) { int T=a[i]; a[i]=a[LL]; a[LL]=T; } }
谁能告诉我我的问题是什么,我该怎么做才能解决它?
在你的代码的问题是,它假设数组中的初始指数1
,最后指数是a.length
,包容性.例如:
for(int i = a.length ; i <= 2 ; i--)
这是不正确的.Java数组索引从零开始,然后转到a.length
,独占.这行代码应如下所示:
for(int i = a.length-1 ; i >= 1 ; i--) // The condition is inverted, too: i <= 2 should be i >= 1
代码中你做出相同假设的另一个地方需要修复如下:
for (int i = n/2 ; i>=1 ; i--) // should be i >= 0