计算鸡鸡 2022-09-18 22:54
浏览 13
已结题

java中堆排序的一点小疑问

问题遇到的现象和发生背景

java语言中写的堆排序代码

用代码块功能插入代码,请勿粘贴截图
public class sort {
    public static void main(String[] args){
        int []arr={30,1001,23,96,78,37,45,66,99,100,1000,1};
        print(arr);
        sort(arr,arr.length);
        print(arr);    
    }
   public static void print(int []arr){//打印数组
      if(arr==null || arr.length<1) return ;
       for(int i: arr) System.out.print(i+" ");
       System.out.println();
   }
public static void sort(int arr[],int n){//堆排序
       for(int i=n/2-1;i>=0;i--)       
           adjustSort(arr,i,n);
       for(int i=n-1;i>0;i--)
       {
           int temp=arr[0];
           arr[0]=arr[i];
           arr[i]=temp;
           adjustSort(arr,0,i);  
       }
   }
      public static void adjustSort(int arr[],int k,int n){
          int temp=arr[k];
          for(int i=2*k+1;i<n;i=2*i+1)
          {
              if(i+1<n && arr[i]<arr[i+1]) {i++;}
             // if(arr[i]<arr[i+1] && i+1<n) i++;
              if(arr[i]>temp) {arr[k]=arr[i]; k=i;}
              else break;
          }
          arr[k]=temp;
         // print(arr);
      }
       
运行结果及报错内容

在adjustSort函数中,第一个if语句执行正确,注释掉的报溢出错

我的解答思路和尝试过的方法

待解决,求

评论

  • 写回答

1条回答 默认 最新

  • 计算鸡鸡 2022-09-18 23:26
    关注

    猜测: 这与&&的执行顺序有关,if(arr[i]<arr[i+1] && i+1<n) i++;的时候,先执行arr[i]<arr[i+1]而i+1所指的数据元素为空,所以会有溢出错误,当反过来先判断i+1< n 时,&&前面的条件为true,后面的才会执行,没有溢出错误

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月26日
  • 已采纳回答 9月18日
  • 创建了问题 9月18日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因