黑马程序员技术交流社区
标题:
关于return在for循环中的问题。。
[打印本页]
作者:
yekong262
时间:
2014-1-22 10:05
标题:
关于return在for循环中的问题。。
本帖最后由 yekong262 于 2014-1-22 10:49 编辑
int [] arr={1,5,6,7};给定一个函数。假如key=8这个函数如何在下面循环中运行的 代码运行顺序。。
复制代码
public static int halfSearch(int [] arr,int key)
{
int max ,min,mid;
max=arr.length-1;
min=0;
mid=(max+min)/2;
while (key!=arr[mid])
{
if (key>arr[mid])
min=mid+1;
else if (key<arr[mid])
max=mid-1;
mid=(max+min)/2;
}
return mid;
复制代码
int [] arr={1,5,6,7};
max=3
min=0
mid=3+0/2=1
第一次运行;8!=arr[1]=5 8>5
min=1+1
mid=2+3/2=2
第2次运行; 8!=arr[2]=6
8>6
min =2+1
mid=3+3/2=3
第3次运行; 8!=arr[3]=7
8>7
min=3+1
mid=4+3/2=3
第4次运行; 8!=arr[3]=7
8>7
min=3+1
mid=4+4/2=4
第5次运行;8!=arr[4]这个时候角标已经越界。怎么还能运行
8>arr[4] 没有这个角标。
作者:
廉伟杰
时间:
2014-1-22 10:22
会调试程序吗?像这类问题,你要学会调试就行
作者:
浮出一个美
时间:
2014-1-22 10:31
二分查找吧,哥们,你忽略了一种情况,如果min<max呢?
我改写了你的代码,你把
if(min<max)
return -1;//没有找到
复制代码
这句话注释掉就可以查看每次循环输出的结果,然后你就会发现原因的
附上一代代码:
public class HalfFind {
public static void main(String[] args) {
int [] arr={1,5,6,7};
System.out.println(halfSearch2(arr, 8));
}
public static int halfSearch(int[] arr, int key) {
int max, min, mid;
max = arr.length - 1;
min = 0;
mid = (max + min) / 2;
while (key != arr[mid]) {
System.out.println(min+"\t"+mid+"\t"+max+"\t"+arr[mid]);
if(min<max)
return -1;//没有找到
if (key > arr[mid])
min = mid + 1;
else if (key < arr[mid])
max = mid - 1;
mid = (max + min) / 2;
}
return mid;
}
public static int halfSearch2(int[] arr, int key) {
int lowerBound = 0;
int upperBound = arr.length - 1;
int curIn;
while(true){
curIn = (lowerBound + upperBound)/2;
if(arr[curIn] == key){
return curIn;
}else if(lowerBound > upperBound){
return -1;
}else{
if(arr[curIn] < key){
lowerBound = curIn + 1;
}else{
upperBound = curIn - 1;
}
}
}
}
}
复制代码
作者:
yekong262
时间:
2014-1-22 10:49
浮出一个美 发表于 2014-1-22 10:31
二分查找吧,哥们,你忽略了一种情况,如果min
哦 我知道哪里错。~
作者:
MyFuture
时间:
2014-1-22 11:59
如果查找不到的话应该会出现一种min > max的情况吧,楼上的朋友是不是写反了?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2