温柔狠角色 2016-09-13 00:57 采纳率: 57.1%
浏览 1052
已结题

堆排序,报异常,数组角标越界,求帮忙看看

代码如下:
package com.package5;

public class HeapSort {

public static void main(String[] args) {
    int[] arr={10,50,30,20,60,80,70,90,40};
    System.out.println(arr.length/2);
    HSort(arr); //进行排序

    for(int i:arr)
    System.out.println(i);

}

public static void HSort(int[] a){

    int i;
    for(i=a.length/2;i>0;i--){
        MaxHeap(a,i,a.length);    //构建大顶堆
    }

    for(i=a.length;i>1;i--){
        swap(a,1,i);//将堆顶纪录和当前未排序子序列的最后一个纪录交换

        MaxHeap(a, 1, i-1);  //将a[]数组其余部分重新调整为大顶堆

    }

}

public  static void swap(int[] a, int i, int j) {

    int temp=a[i];
    a[i]=a[j];
    a[j]=temp;

}

public static void MaxHeap(int[] a, int s, int m) {

    int temp,j;
    temp=a[s];

    for(j=2*s;j<=m;j*=2){   //沿关键字较大的孩子节点向下筛选

        if(j<m&&a[j]<a[j+1]){  //!!!!!!!!报 java.lang.ArrayIndexOutOfBoundsException
            ++j;           //j为关键字中较大纪录的下标
        }

        if(temp>=a[j]){
            break;
        }

        a[s]=a[j];
        s=j;

    }

    a[s]=temp;     //插入数据
}

}

  • 写回答

2条回答

  • 南屏山敲钟人 2016-09-13 01:58
    关注

    用调试工具单步循环应该可以发现问题

    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记