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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Friends★ 中级黑马   /  2012-4-18 08:34  /  1870 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Friends★ 于 2012-4-18 08:36 编辑

请问这段代码哪里出了问题,我执行的时候,Eclipse也不报错,但是就是没有结果输出,而且执行的时候还会把我电脑搞死机,好像执行很费劲,问题在哪?

class  Test{      


public static void main(String[] args) {        


        int[]  array={3,4,6,8,9,10};      


      int index=halfSearch(array,8);        


  System.out.println(index);      


  }               


public static  int halfSearch(int[] array,int key){      


          int min=0;               


int max=array.length-1;            


   int mid=(min+max)/2;               


while(array[mid]!=key){                  


     if(array[mid]>key)                        


    min=mid+1;                     


   else if(array[mid]<key)                       


         max=mid-1;              


  }                  


*             return mid;        }


}


评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

8 个回复

正序浏览
刚才代码没复制好:public class Test {

        public static void main(String[] args) {

                int[] array = { 3, 4, 6, 8, 9, 10 };

                int index = halfSearch(array, 5);

                System.out.println(index);

        }

        public static int halfSearch(int[] array, int key) {

                int min = 0;

                int max = array.length - 1;

                int mid = (min + max) / 2;

                while (array[mid] != key) {

                        if (array[mid] > key)

                                max = mid - 1;

                        else if (array[mid] < key)

                                min = mid + 1;
                        mid = (min + max)/2;
                       

                }
               
                if(min>max){
                        return -1;
                }

                return mid;
        }

}
回复 使用道具 举报
1.把   mid=(min+max)/2;    添加到while循环的末尾。
2.while循环里面的  if(array[mid]>key)   min=mid+1;   改为if (array[mid] > key)    max = mid - 1;
3.while循环里面的 else if(array[mid]<key)   max=mid-1;   改为 else if (array[mid] < key)    min = mid + 1;
4.在while循环外面添加判定条件else if (array[mid] < key)   min = mid + 1;//如果没有找到要查找的数则返回-1.
5.修改后的代码如下:else if (array[mid] < key)

                                min = mid + 1;
回复 使用道具 举报
林豪 中级黑马 2012-4-18 10:00:44
7#
public static  int halfSearch(int[] array,int key){      

          int min=0;               

int max=array.length-1;            

   int mid=(min+max)/2;      

  while(min<=max){                  

     if(array[mid]>key)                        

    min=mid+1;                     

   else if(array[mid]<key)                       

         max=mid-1;              

  }                  

*             return mid;        }

}
这段写错了,既然中值比KEY大,那么你KEY应该在左边,应该是
public static  int halfSearch(int[] array,int key){      

          int min=0;               

int max=array.length-1;            

   int mid=(min+max)/2;      

while(array[mid]!=key){                  

     if(array[mid]<key)                        

    min=mid+1;                     

   else if(array[mid]>key)                       

         max=mid-1;        
   else
         return mid;      

  }                  

          return -1;        }

}
这样就可以了,运行失败可以拿张纸写写过程,要考虑找不到的情况!!
回复 使用道具 举报
知道哪里错了,谢咯!
回复 使用道具 举报
在while循环里,当arr[mid]>key时,应该是max=mid-1;当arr[mid]<key时应该是min=mid+1;l另外,你的mid值咋i循环里没有被改变,这样就一直是拿第一个arr[mid]值即arr[2]在和8比较,所以构成死循环,如果在循环里加一句mid=(min+max)/2就可以改变mid的值,但这样也有问题,原因是你循环结束的条件选错了,有可能造成max小于min的情况。
回复 使用道具 举报
循环中判断mid数值和key的大小有误,按照你的判断方法array[mid]>key,说明key在min与mid之间,所以应该将中间值mid改为最大值max,而不是你写的最小值改为中间值,第二个判断同理。
回复 使用道具 举报
while循环不能这么写,你写的当array[mid]!=key时,一直循环,要知道array[mid]=key 的几率很小,这样就成了死循环。最好使用if。
回复 使用道具 举报
楼主你while里面写错了,应该这样的:
if(key>array[mid])
    min=mid+1;
else if(key<array[mid])
   max=mid-1;
if(min>max)
   return  -1;
mid=(max+min)/2

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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