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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 睡不够的猪 中级黑马   /  2013-9-6 19:53  /  1406 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 睡不够的猪 于 2013-9-6 20:02 编辑

class ZheBan
{
       public static void main(String[] args)
       {
              int[] arr={1,5,8,7,9,11,25,36};
              int x=getIndex(arr,9);
              System.out.println(x);
              System.out.println("hello");
       }

       public static int getIndex(int[] arr,int key)
       {
              int min=0,max=arr.length-1,mid;
              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 min;
       }
}

这段代码应该没有问题吧 因为每次用javac编译都能通过,可是为什么每次用java执行的时候 dos窗口都不动呢?(有点像是dos卡死了。。。)
请问还有没有遇到过这种情况呢 该怎么办呢???



评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

6 个回复

倒序浏览
首先折半查找是建立在数组有序的基础上的,你这数组是无序的。
然后mid=(min+max)>>2;这条指令有问题,该为mid=(min+max)>>1;右移1位就是除2,移2位是除4

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
晕死 弄错了个数字 折磨了我半天。。。
  mid=(min+max)>>2;
应该是:mid=(min+max)>>1;
回复 使用道具 举报
你的代码在你求mid值时出错了,好好看看怎样用位移运算吧
  1. class ZheBan
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                int[] arr={1,5,8,7,9,11,25,36};
  6.                int x=getIndex(arr,9);
  7.                System.out.println(x);
  8.                System.out.println("hello");
  9.         }

  10.         public static int getIndex(int[] arr,int key)
  11.         {
  12.                int min=0,max=arr.length-1,mid;
  13.                while(min<=max)
  14.                {
  15.                        //向右移几位,就是除以2的几次幂,你要除以2,右移1位就行
  16.                      mid=(min+max)>>1;
  17.                      if(key>arr[mid])
  18.                               min=mid+1;
  19.                      else if(key<arr[mid])
  20.                               max=mid-1;
  21.                      else
  22.                               return mid;
  23.                 }
  24.                return min;
  25.         }
  26. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
  1. class ZheBan {
  2.         public static void main(String[] args) {
  3.                 int[] arr = { 1, 5, 8, 7, 9, 11, 25, 36 };
  4.                 int x = getIndex(arr, 9);
  5.                 System.out.println(x);
  6.                 System.out.println("hello");
  7.         }

  8.         public static int getIndex(int[] arr, int key) {
  9.                 int min = 0, max = arr.length - 1, mid;
  10.                 while (min <= max) {
  11.                         mid = (min + max) >> 1;
  12.                         if (key > arr[mid])
  13.                                 min = mid + 1;
  14.                         else if (key < arr[mid])
  15.                                 max = mid - 1;
  16.                         else
  17.                                 return mid;
  18.                 }
  19.                 return min;
  20.         }
  21. }
复制代码
第12行  mid = (min + max) >> 1;

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
mid=(min+max)>>2;
2改成1,
右移2是除以4
要折半除以2要右移1

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
循环条件有问题,是个死循环:
public static int getIndex(int[] arr,int key)
       {
              int min=0,max=arr.length-1,mid=(min + max)/2;
              while(arr[mid]!=key)
              {
                  
                    if(key>arr[mid]){
                             min=mid+1;
                    }else {
                             max=mid-1;
                    }
                            mid=(min+max)/2;
               }
              return min;
       }

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

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