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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔玉朋 初级黑马   /  2012-7-4 16:20  /  1714 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔玉朋 于 2012-7-4 17:46 编辑

//为什么我运行着加粗的那句话在这和在while里面的结果都一样呢?
public class HalfSearch {
        public static int half_2(int []arr,int key)
        {
                int min,max,mid;
                min = 0;
                max = arr.length;
                mid = (min+max)/2;
                while(min<max)
                {        
                        if(key>arr[mid])
                                min = mid+1;
                        else if(key<arr[mid])
                                max = mid-1;
                        else
                                return mid;
                }
                return -1;
        }
public static void main(String[] args) {
               
                int [] arr = {2,3,5,6,8,9,12,35};
                int num2 = half(arr,12);
                System.out.print(num2);

        }

}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 折半查找是比较常用的查找算法,楼主要多加.

查看全部评分

5 个回复

倒序浏览
你这个里面的min和max的值在引入实参arr的时候就已经为定值了,当然在局部变量和成员变量都可以的,没什么影响
回复 使用道具 举报
本帖最后由 韦念欣 于 2012-7-4 16:33 编辑

mid = (min+max)/2;
这个语句必须放在循环里面,否则是错误的。
折半查找中的折半操作,就是考这条语句来实现的了,如果你不写在循环里,那么你只能折半一次,而不能连续的折半。
楼主可以使用更多的数据来测试看看结果,就明白了。
回复 使用道具 举报
本帖最后由 田向向 于 2012-7-4 17:11 编辑

折半查找,max = arr.length-1;并且你在循环语句里面也忘了折半:在if(key>arr[mid])前面加一句mid = (min+max)/2;。主函数里面应该是int num2=half_2(arr,12);,而不是 int num2 = half(arr,12);。:min;mid和max代表的是角标,角标从0开始,arr.length是数组的长度,以前我在这方面糊涂的时候,刘蕴学版主给我说过这么一句话:你把角标当成编号,这个编号是从0开始,在把len当成存在的数量,那他就只能是从1开始,因为0表示没有。把它告诉你,希望你能明白。
整理后的代码:
public class HalfSearch {
         public static int half_2(int []arr,int key)
         {
                 int min,max,mid;
                 min = 0;
                 max = arr.length-1;
                 mid = (min+max)/2;
                 while(min<max)
                 {        
                      mid = (min+max)/2;
                        if(key>arr[mid])
                                 min = mid+1;
                         else if(key<arr[mid])
                                 max = mid-1;
                         else
                                 return mid;
                 }
                 return -1;
         }
public static void main(String[] args) {
                 
                int [] arr = {2,3,5,6,8,9,12,35};
                 int num2 = half_2(arr,12);
                 System.out.print(num2);

        }

}

纯手工,希望对你有所帮助,,要是哪里有不对的请拍砖
回复 使用道具 举报
本帖最后由 王明明 于 2012-7-4 16:59 编辑

class Demo {
        public static int half(int []arr,int key)
        {
                int min,max,mid;
                min = 0;
                max = arr.length;
                while(min<=max)//加上=的号的原因是 当你查找的是2字符的时候 你会发现没加=号 会返回-1 因为min==0 max在mid-1的时候也成了0
                {        
                        mid = (min+max)/2;//必须把mid的计算放在循环里面
                        if(key>arr[mid])
                                min = mid+1;
                        else if(key<arr[mid])
                                max = mid-1;
                        else
                                return mid;
                }
                return -1;
        }
public static void main(String[] args) {
               
                int [] arr = {2,3,5,6,8,9,12,35};
                int num2 = half(arr,2);
                System.out.print(num2);

        }

}
或者也可以这样
class Demo {
        public static int half(int []arr,int key)
        {
                int min,max,mid;
                min = 0;
                max = arr.length;
    boolean num = true;
                while(num)
                {        
      mid = (min+max)/2;
                        if(key>arr[mid])
                                min = mid+1;
       else if(key<arr[mid])
                                max = mid-1;
      else if (key == arr[mid])
                                return mid;
      else
       num = false;
                }
                return -1;
        }
public static void main(String[] args) {
               
                int [] arr = {2,3,5,6,8,9,12,35};
                int num2 = half(arr,2);
                System.out.println(num2);
        }
}
回复 使用道具 举报
田向向 发表于 2012-7-4 16:33
折半查找,max = arr.length-1;并且你在循环语句里面也忘了折半:在if(key>arr[mid])前面加一句mid = (min ...

ok,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马