黑马程序员技术交流社区

标题: 菜鸟求解(代码问题) [打印本页]

作者: (_演绎、青春    时间: 2014-5-21 23:02
标题: 菜鸟求解(代码问题)
我是个无基础刚开始学Java的童鞋,求高手详细讲解下。代码的位置放置问题。注释的那儿,
代码如下:

class  ZheBan_2  //折半查找的第二种方法
{
        public static void main(String[] args)
        {
                int arr[]={3,5,8,12,16,20,32,45};
                int index=zheBan_2(arr,20);
                System.out.println("index:"+index);
        }

        public static int zheBan_2(int [] arr,int key)
        {
                int min=0,max=arr.length-1,mid;// 为什么在这里不能先给mid赋上值呢?
               
                while (min<=max)
                {
                        mid=(min+max)/2; // 为什么要在while语句内,这个位置赋值,在while外不行...
                        if (key>arr[mid])
                        {
                                min=mid+1;
                        }
                        else if (key<arr[mid])
                        {
                                max=mid-1;
                        }
                        else
                                return mid;
                }
                return -1;
        }
}

作者: zhrnghgwsws    时间: 2014-5-21 23:15
你自己从上往下,把每一步读一篇就知道了。
作者: wangleixhlm    时间: 2014-5-21 23:18
要循环赋值啊。所以在while里肯定要有mid赋值的语句,如果在外面赋一次值,里面也不能少,那岂不是多此一举了。
作者: 海世山盟    时间: 2014-5-21 23:20
mid在循环外一样可以赋值。
public static int zheBan_2(int [] arr,int key)
        {
                int min=0,max=arr.length-1,mid=(min+max)/2;// 为什么在这里不能先给mid赋上值呢?
               
                while (min<=max)
                {
                        mid=(min+max)/2; //必须保留因为,mid记录的是一个变化的值
                        if (key>arr[mid])
                        {
但是我们定义mid的目的就是为了记录中间值,mid的值是会随着min+max变化的,因此mid是需要放在while循环里面的。这样的话循环里的mid就会覆盖while外边的值了。因此为了省事就不必要在外边定义了,但是定义了是没有任何影响的。
作者: 路漫漫_求索    时间: 2014-5-22 00:09
1. 为什么在这里不能先给mid赋上值呢?int min=0,max=arr.length-1,mid;
因为mid取的是数组长度的中间值。即min和max相加除以2的中间值

mid=(min+max)/2; // 为什么要在while语句内,这个位置赋值,在while外不行.

因为每次循环判断,mid中间值都会变化,所以要定在循环里面

如下代码。。。。
if(key>arr2[mid])
{
min = mid+1;//如果查找数比中间角标所在数的值大,最小角标将从当前角标值右移1位
}else if(key<arr2[mid])
max = mid-1;//如果查找数比中间角标所在数的值小,最大角标将从当前

希望对你有帮助。。。。
作者: (_演绎、青春    时间: 2014-5-22 14:05
路漫漫_求索 发表于 2014-5-22 00:09
1. 为什么在这里不能先给mid赋上值呢?int min=0,max=arr.length-1,mid;
因为mid取的是数组长度的中间值。 ...

谢谢,懂了。
作者: (_演绎、青春    时间: 2014-5-22 14:06
海世山盟 发表于 2014-5-21 23:20
mid在循环外一样可以赋值。
public static int zheBan_2(int [] arr,int key)
        {

谢谢大师的详解。
作者: (_演绎、青春    时间: 2014-5-22 14:07
wangleixhlm 发表于 2014-5-21 23:18
要循环赋值啊。所以在while里肯定要有mid赋值的语句,如果在外面赋一次值,里面也不能少,那岂不是多此一举 ...

:handshake 明白了
作者: 张志民    时间: 2014-5-22 20:37
3楼出的很明白




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