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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© javaking 高级黑马   /  2015-6-28 16:19  /  619 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 javaking 于 2015-6-28 16:21 编辑

刚才看java视频发现一个二分查找的问题 请各位大大指教一下

  1. class  Erfen
  2. {
  3. public static void main(String[] args)
  4. {
  5.   int[]arr={23,34,45,56,78,89,101};
  6.   //             0   1  2    3   4   5    6
  7.   int num=sel(arr,891);
  8.   System.out.println("要查找的数值角标为"+num);
  9. }
  10. public static int sel(int[]arr,int key)
  11. {
  12.   int min,mid,max;
  13.   min=0;
  14.   mid=(0+arr.length-1)/2;
  15.   max=arr.length;
  16. while(key!=arr[mid])
  17.   {
  18.    if(key>arr[mid])
  19.    {
  20.     min=mid+1;
  21.    }
  22.    else if(key<arr[mid])
  23.    {
  24.     max=mid-1;
  25.    }
  26.    
  27.    if(min>max)
  28. /*视频此处为min>max;但是我查找一个数比数组最大值还大的时候,编译器报

  29. 错,提示ArrayIndexOutOfBoundsException
  30. 修改为 min>mid 就报-1了   
  31. */
  32.    {
  33.     return -1;
  34.    }
  35.    mid=(min+max)/2;
  36.   }
  37.   return mid;
  38. }
  39. }
复制代码
if(min>max) /*视频此处为min>max;但是我查找一个数比数组里最大值还大的时候,编译器报
错,提示ArrayIndexOutOfBoundsException
修改为 min>mid 就报-1了   
*/
请问这一块是不是视频里错了~~
   

6 个回复

倒序浏览
max=arr.length-1;
注意这个,改了以后我试了一下正常了
回复 使用道具 举报
kirsting 发表于 2015-6-28 16:35
max=arr.length-1;
注意这个,改了以后我试了一下正常了

赞。。是我疏忽了
回复 使用道具 举报
而且既然mid=(min+max)/2;
就不要这样写了
min=0;
mid=(0+arr.length-1)/2; (这里的max初值是正确的,说明你粗心了)
max=arr.length;
写成
min=0;
max=arr.length-1;
mid=(min+max)/2;
回复 使用道具 举报
javaking 发表于 2015-6-28 16:46
赞。。是我疏忽了

哈哈哈,共勉共勉,我也刚学到这附近
回复 使用道具 举报
不错,经验都是从错误中得来的
回复 使用道具 举报
kirsting 发表于 2015-6-28 16:48
而且既然mid=(min+max)/2;
就不要这样写了
min=0;

的确,好多细节需要注意
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马