黑马程序员技术交流社区

标题: 关于数组数据折半查找法的问题 [打印本页]

作者: 金鑫613    时间: 2012-10-8 21:01
标题: 关于数组数据折半查找法的问题
本帖最后由 金鑫613 于 2012-10-8 21:42 编辑
  1. class  Zheban
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[]arr=new int[]{0,1,2,3,4,5,6,7,8};
  6.                 System.out.println(chazhao(arr,0));
  7.                 System.out.println(chazhao(arr,4));
  8.                 System.out.println(chazhao(arr,8));
  9.                 System.out.println(chazhao(arr,10));
  10.         }
  11. //用折半法查找给定数据在数组中第一次出现的位置
  12.         public static int chazhao(int arr[],int key)
  13.         {
  14.                 int min=0;
  15.                 int max=arr.length;
  16.                 int mid=(min+max)>>1;
  17.                 while (max>=min)
  18.                 {
  19.                         if (key>arr[mid])
  20.                         {
  21.                                 min=mid+1;
  22.                         }
  23.                         else if (key<arr[mid])
  24.                         {
  25.                                 max=mid-1;
  26.                         }
  27.                         else
  28.                                 return mid;
  29.                         mid=(min+max)>>1;
  30.                 }
  31.                 return -1;
  32.         }
  33. }
复制代码
大家好,我最近刚开始学习java基础,今天看完毕老师关于数组教学的视频后练习编写的数组查询函数,但出现一个问题,当查找的数据大于数组中的最大值时会出现以下这种情况:

定义的升序排列的数组为{0,1,2,3,4,5,6,7,8},查找的数据key我设定的是数组中的最小值0,中间值4,最大值8,以及超出最大值的10。
现在的问题是前三个数据都能正常查找,但在查找超出范围的数据10的时候出现上述问题,检查了两遍没有发现出现这个问题的原因,请大家帮忙查找一下问题的所在。


作者: 李兆宁    时间: 2012-10-8 21:04
本帖最后由 李兆宁 于 2012-10-8 21:11 编辑

length是数组长度,最后一个角标要减1,在程序15行。。
作者: 金鑫613    时间: 2012-10-8 21:17
李兆宁 发表于 2012-10-8 21:04
length是数组长度,最后一个角标要减1,在程序15行。。

嗯 是的 谢谢 我也才刚发现
作者: 王梁星    时间: 2012-10-8 21:26
本帖最后由 缘木求鱼 于 2012-10-8 21:40 编辑

一楼是正解。但是究其原因的话就是:

你的程序中定义 max的长度为arr.length.单是arr[max]就已经越界了



作者: 王震阳老师    时间: 2012-10-8 21:29
李兆宁 发表于 2012-10-8 21:04
length是数组长度,最后一个角标要减1,在程序15行。。

嗯。max=arr.length-1;就对了。异常其实也提示这个错误了,java。lang.ArrayIndexOutOfBoundOfBoundsException。就是给你提示。
作者: 韩军博    时间: 2012-10-8 21:31
金鑫613 发表于 2012-10-8 21:17
嗯 是的 谢谢 我也才刚发现

如果问题解决,帖子改为已解决,谢谢配合
作者: 金鑫613    时间: 2012-10-8 21:33
韩军博 发表于 2012-10-8 21:31
如果问题解决,帖子改为已解决,谢谢配合

请问一下怎么更改
作者: 徐传任    时间: 2012-10-8 22:43
看看..............




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2