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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© (_演绎、青春 中级黑马   /  2014-5-21 23:02  /  1714 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我是个无基础刚开始学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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

8 个回复

倒序浏览
你自己从上往下,把每一步读一篇就知道了。
回复 使用道具 举报
要循环赋值啊。所以在while里肯定要有mid赋值的语句,如果在外面赋一次值,里面也不能少,那岂不是多此一举了。
回复 使用道具 举报
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外边的值了。因此为了省事就不必要在外边定义了,但是定义了是没有任何影响的。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
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;//如果查找数比中间角标所在数的值小,最大角标将从当前

希望对你有帮助。。。。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
路漫漫_求索 发表于 2014-5-22 00:09
1. 为什么在这里不能先给mid赋上值呢?int min=0,max=arr.length-1,mid;
因为mid取的是数组长度的中间值。 ...

谢谢,懂了。
回复 使用道具 举报
海世山盟 发表于 2014-5-21 23:20
mid在循环外一样可以赋值。
public static int zheBan_2(int [] arr,int key)
        {

谢谢大师的详解。
回复 使用道具 举报
wangleixhlm 发表于 2014-5-21 23:18
要循环赋值啊。所以在while里肯定要有mid赋值的语句,如果在外面赋一次值,里面也不能少,那岂不是多此一举 ...

:handshake 明白了
回复 使用道具 举报
3楼出的很明白
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马