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

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日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境