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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王龙 中级黑马   /  2012-10-19 23:58  /  1767 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package number1;
//数组的查找操作
public class Test7 {

  public static void main(String[] orgs){
   int[] arr={1,5,7,8,13,15,18};
  int index=halfSearch(arr,13);
   System.out.println("index="+index);
   
}
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]!=key){
  if(key>arr[mid])
   min=mid+1;
  else if(key<arr[mid])
   max=mid-1;
  if(min>max)
   return -1;
  
  mid=(min+mid)/2;
}
return mid;
}
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 徐梦侠 于 2012-10-20 00:14 编辑

因为你方法体中的出现了一个错误,没有正确计算mid
public static int halfSearch(int[] arr,int key)
{
  int min,max,mid;
  min=0;
  max=arr.length-1;
  mid=(min+max)/2;
  int x=0,y=0;
  while(arr[mid]!=key){
      if(key>arr[mid])
       min=mid+1;
      else if(key<arr[mid])
       max=mid-1;
      if(min>max)
       return -1;
      mid=(min+mid)/2; //应该是mid=(max+min)/2;
  }
  return mid;
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
我把代码修改了一下。
public static int halfSearch(int[] arr,int key)
         {
                 int min,max,mid;
                 min=0;
                 max=arr.length-1;
                 mid=(min+max)/2;
                 while(arr[mid]!=key){
                   if(key>arr[mid])
                      min=mid+1;
                   else if(key<arr[mid])
                      max=mid-1;
                   if(min>max)
                            return -1;
                   mid=(min+max)/2;
                 }
             return mid;
         }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 sun~~ 于 2012-10-20 02:48 编辑

毕老师讲的的折半查找,但是这个查找但是必须要保证该数组是有序的数组。
//package number1;这要注释掉
//数组的查找操作
public class Test7 {

  public static void main(String[] orgs){
   int[] arr={1,5,7,8,13,15,18};
  int index=halfSearch(arr,13);
   System.out.println("index="+index);
   
}
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]!=key){
  if(key>arr[mid])
   min=mid+1;
  else if(key<arr[mid])
   max=mid-1;
  if(min>max)
   return -1;
  
  mid=(min+mid)/2;//这里出错应改为mid=(min+max)/2
}
return mid;
}
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 漠言 于 2012-10-20 08:07 编辑

折半查找是定义两个变量max和min,分别取有序数组的最大和最小角标,然后通过角标mid=(max+min)/2所对应的元素与要查找的元素key作比较。如果mid较大, max就要左移至mid-1;如果key较大,min就要右移至mid+1。如果在数组中找到与key相同的元素,就返回mid,即对应元素的角标。如果循环进行到min大于max,代表数组中没有与key相同的元素,返回-1,(数组角标没有-1,代表没有这个元素)。所以要把原代码中的mid=(min+mid)/2改成mid=(min+max)/2,即折中的意思。如果是mid=(min+mid)/2的话,因为if(key>arr[mid])   min=mid+1;   mid始终为3,min始终为4, 循环将无限进行下去,因此没有输出结果的。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
非常感谢大伙,努力中
回复 使用道具 举报
王龙 中级黑马 2012-10-20 08:29:12
7#
非常感谢大伙,努力中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马