黑马程序员技术交流社区
标题:
做折半查找的时候遇到一个小问题
[打印本页]
作者:
王亚飞
时间:
2012-11-29 14:49
标题:
做折半查找的时候遇到一个小问题
public class text
{
public static void main(String[] agrs)
{
int[]arr = {1,2,3,4,5};
int Index = half(arr,2);
System.out.println("Index = "+Index);
}
public static int half(int[] arr,int key)
{
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (min+max)/2;//这里已经定义了mid
while(arr[mid]!=key)
{
if(key>arr[mid])
min = mid+1;
else if(key<arr[mid])
max = mid-1;
if(min>max)
return -1;
mid = (min+max)/2;//这为什么还要写一次呢
}
return mid;
}
}
复制代码
上面的代码是可以运行的,但是while循环之前已经写了mid = (max+min)/2 为什么在循环里还要写一次
作者:
何伟
时间:
2012-11-29 15:08
本帖最后由 何伟 于 2012-11-29 15:18 编辑
因为每循环一次min或者max都会变,所以mid也会变得,直到循环条件不满足。第一次是给mid初始化值,下面在写一次的原因是给mid重新赋值,在重新判断是否进入循环,你发现没有循环条件是mid与key比较,而key是不变,如果不在下面重新给mid重新赋值就是死循环了。
作者:
邱峁
时间:
2012-11-29 15:18
if(min>max)
return -1;
mid = (min+max)/2;//这为什么还要写一次
}
你这里的mid = (min+max)/2能执行吗,
哥们你能不能不这么逗啊
作者:
何伟
时间:
2012-11-29 15:24
邱峁 发表于 2012-11-29 15:18
if(min>max)
return -1;
mid = (min+max)/2;//这为什么还要写一次
能执行的
这里if语句不包括
【mid = (min+max)/2;//这为什么还要写一次】
这句话,楼主只是把{}省略了,不写{}的if语句只对离它最近的语句有效
作者:
邱峁
时间:
2012-11-29 15:39
刚看到
它有这个条件
if(min>max)
return -1;
mid = (min+max)/2;//这为什么还要写一次呢
不会进入死循环的,只是找不到值返回-1
作者:
王亚飞
时间:
2012-11-30 15:53
邱峁 发表于 2012-11-29 15:18
if(min>max)
return -1;
mid = (min+max)/2;//这为什么还要写一次
我不逗,自己运行看看能不能
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2