黑马程序员技术交流社区

标题: 怎么没有输出结果 [打印本页]

作者: 王龙    时间: 2012-10-19 23:58
标题: 怎么没有输出结果
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;
}
}

作者: 徐梦侠    时间: 2012-10-20 00:13
本帖最后由 徐梦侠 于 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;
}
作者: 丁旭    时间: 2012-10-20 00:19
我把代码修改了一下。
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;
         }
作者: sun~~    时间: 2012-10-20 02:41
本帖最后由 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;
}
}
作者: 黑马李超    时间: 2012-10-20 07:01
本帖最后由 漠言 于 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, 循环将无限进行下去,因此没有输出结果的。
作者: 王龙    时间: 2012-10-20 08:29
非常感谢大伙,努力中
作者: 王龙    时间: 2012-10-20 08:29
非常感谢大伙,努力中




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2