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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田向向 高级黑马   /  2012-7-1 00:01  /  2765 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田向向 于 2012-7-1 08:25 编辑

不知道是不是今天给别人搬行李把脑子给累出毛病的原因,刚才在看比老师的视频(数组折半查找)中,为什么会取最大值max=arr.length-1;这个视频这一段我连着看了三四遍,都没看明白,请指点,,我是初学者,希望大家不要嘲笑我。

2.jpg (11.46 KB, 下载次数: 50)

2.jpg

点评

虚心求教并不可耻  发表于 2012-7-1 00:02

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

5 个回复

倒序浏览
数组的首位是从角标0开始的。所以最后的角标应为length-1.这你应该明白了,不明白可以继续问。

2.jpg (11.46 KB, 下载次数: 52)

2.jpg
回复 使用道具 举报
赵志勇 发表于 2012-7-1 00:21
数组的首位是从角标0开始的。所以最后的角标应为length-1.这你应该明白了,不明白可以继续问。 ...

你的意思是说,数组的那个length是从1开始的,,但是角标是从0开始的,,所以到最后一个应该用length-1,对吗??

点评

你把角标当成编号,这个编号是从0开始,在把len当成存在的数量,那他就只能是从1开始,因为0表示没有  发表于 2012-7-1 15:25
回复 使用道具 举报
本帖最后由 feigecal 于 2012-7-1 00:39 编辑

折半查找是每次都用中间角标位置上的值mid和要查找 的值比较,如果小于要查找的值那么说明要查找的值在mid的右边,那么就把mid的角标加一的角标上的值做为最小值,再进行折半,如果mid大于要查找的值,那就把mid的角标减一的角标上的值做为最大值再进行折半,只所以max=arr.length-1,是因为arr.length是数组的长度,而数组的角标是从0开始的,所以最大角标就是长度减去1了。给你个例子看看
  1. /**
  2. 用折半法在一个数组中查找指定的值在数组中的角标位
  3. */
  4. class ZheBan
  5. {
  6. public static void main(String[] args)
  7. {
  8. int [] arr={3,4,6,3,7,9,8,2};
  9. int a=chaZhao(arr,7);//调用查找功能
  10. System.out.println(a);
  11. }
  12. public static int chaZhao(int[] arr,int key)//定义一个功能,用于查找
  13. {
  14. int min,mid,max;
  15. min=0;
  16. max=arr.length-1;
  17. while(min<=max)
  18. {
  19. mid=(min+max)/2;
  20. if (key<arr[mid])
  21. {
  22. max=mid-1;
  23. }
  24. else if(key>arr[mid])
  25. {
  26. min=mid+1;
  27. }
  28. else
  29. return mid;
  30. }
  31. return -1;//数组中没有要查找的数时打印出-1
  32. }
  33. }
复制代码

点评

虽然你得代码我还有点糊涂,但是你说的那段话的意思我明白了,,谢谢你啦  发表于 2012-7-1 08:22

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
刘蕴学 + 1
田向向 + 1

查看全部评分

回复 使用道具 举报
田向向 发表于 2012-7-1 00:29
你的意思是说,数组的那个length是从1开始的,,但是角标是从0开始的,,所以到最后一个应该用length-1, ...

应该是这样,如果length 是1,则角标是0.

点评

谢谢你  发表于 2012-7-1 08:22

评分

参与人数 1黑马币 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 邵阳 于 2012-7-1 08:36 编辑

楼主我一看到你的问题我都感觉哪里好像不对,然后又看了看视频,对于你给出的数组是不能用于折半查找的。
折半查找不同于一般查找,折半查找前提是数组里面的元素必须是由小往大(或者由大往小)。
所以显然你的数组不符合这种情况,所以你的先将数组先排序,然后用折半查找,否则你要么不能的得出正确结果,要么结果是错误的。
对于你说的max=arr.length-1,因为数组里面每个元素都有一个角标,角标是从0开始分配的,还有arr.length表示数组里面的元素个数,又max代表最大角标值,所以max必然是arr.length-1. 此时mid=0

点评

我截图的时候截错地方了,,所以我昨天又补了一张,  发表于 2012-7-1 08:24
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马