A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭刚 初级黑马   /  2013-12-4 09:39  /  1003 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如题,一下代码结果为什么不是-1而是角标越界,key应该是元素值啊
class  ArrayTest4
{
    public static void main(String[] args)
        {
               int[] arr ={1,2,3,4,5,6};
           int index = halfSearch_1(arr,10);
           System.out.println("index="+index);
    }
    public static int halfSearch_1(int[] arr, int key)
        {
                int Max=arr.length, Min=0, Mid;
                while (Min<=Max)
                {
                        Mid =(Min+Max)>>1;
                        if (key>arr[Mid])
                                Min = Mid + 1;
                        else if (key<arr[Mid])
                                Max = Mid - 1;
                        else
                                return Mid;
                }
                return -1;
     }
}

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 淡定

查看全部评分

5 个回复

倒序浏览
arr.length代表是的数组长度,而数组角标是从0开始的,所以你代码中int Max=arr.length应该改为int Max=arr.length-1,如果是int Max=arr.length当然会出现角标越界异常了。
回复 使用道具 举报
楼主的程序有问题:变量max初始化时应该是最大元素的下标,应该是arr.length-1
应该把代码'max = arr.length'改为'max = arr.length-1'
至于报下标越界异常是因为
当传递的key值大于数组中的最大值时,max的值不会改变,为arr.length,min的值一直会变大,
循环到最后min=max=arr.length',此时mid=arr.length,而数组最大下标为arr.length-1',
所以当程序执行到if (key>arr[mid])时,会发生数组下标越界异常

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
非常感谢
回复 使用道具 举报
正确代码如下:

  1. <P>class  ArrayTest
  2. {
  3.     public static void main(String[] args)
  4.         {
  5.                int[] arr ={1,2,3,4,5,6};
  6.            int index = halfSearch_1(arr,10);
  7.            System.out.println("index="+index);
  8.     }
  9.     public static int halfSearch_1(int[] arr, int key)
  10.         {
  11.                 int Max=arr.length-1, Min=0, Mid;
  12.                 while (Min<=Max)
  13.                 {
  14.                         Mid =(Min+Max)>>1;
  15.                         if (key>arr[Mid])
  16.                                 Min = Mid + 1;
  17.                         else if (key<arr[Mid])
  18.                                 Max = Mid - 1;
  19.                         else
  20.                                 return Mid;
  21.                 }
  22.                 return -1;
  23.      }
  24. }</P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
下次问题解决了就把类型改成提问结束!谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马