黑马程序员技术交流社区

标题: 折半查找,程序编译通过不能执行,帮忙找错 [打印本页]

作者: 朱秀梅    时间: 2012-6-12 23:27
标题: 折半查找,程序编译通过不能执行,帮忙找错
这是我的代码
/*
        折半查找
*/
class HalfSearch
{
        public static void main(String[] args)
        {
                int arr[] = {1,3,5,6,7,9,12,24};
                //System.out.println(halfSearch( arr, 0, arr.length, 2 ));
                int num = halfSearch( arr, 23 );
                System.out.println(num);
        }
        
        private static int halfSearch ( int arr[], int key )
        {
                int left, right, mid;
                left = 0;
                right = arr.length - 1;        
                while ( left < right )
                {
                        mid = ( left + right ) / 2;               
                        if ( key == arr[mid] )
                        {
                                return mid;
                        }
                        else if ( key < arr[mid] )
                        {
                                right = mid;
                        }
                        else if ( key > arr[mid] )
                        {
                                left = mid;
                        }
                }
                return -1;
        }
}
编译通过但是达不到要求的结果

作者: 王晓新    时间: 2012-6-12 23:36
  1. class HalfSearch
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 int arr[] = {1,3,5,6,7,9,12,24};
  6.                 int num = halfSearch( arr, 23 );
  7.                 System.out.println(num);
  8.         }      
  9.         private static int halfSearch ( int arr[], int key )
  10.         {
  11.                 int left, right, mid;
  12.                 left = 0;
  13.                 right = arr.length;        
  14.                 while ( left < right )
  15.                 {
  16.                         mid = ( left + right ) / 2;               
  17.                         if ( key == arr[mid] )
  18.                         {
  19.                                 return mid;
  20.                         }
  21.                         else if ( key < arr[mid] )
  22.                         {
  23.                                 right = mid-1;
  24.                         }
  25.                         else if ( key > arr[mid] )
  26.                         {
  27.                                 left = mid+1;
  28.                         }
  29.                 }
  30.                 return -1;
  31.         }
  32. }
复制代码
我运行成功了。。你看看
作者: 江南    时间: 2012-6-12 23:36
你的折半查找的函数中的条件语句有错,修改之后如下:
class HalfSearch

{

     public static void main(String[] args)

        {

                int arr[] = {1,3,5,6,7,9,12,24};

                //System.out.println(halfSearch( arr, 0, arr.length, 2

));

                int num = halfSearch(arr,23);

                System.out.println(num);

        }

        

        private static int halfSearch (int arr[],int key)

        {

               int left, right, mid;

                left = 0;

                right = arr.length - 1;        

                while ( left < right )

                {

                        mid = ( left + right )/ 2;               

                        if ( key == arr[mid] )

                       {

                               return mid;

                        }

                       else if ( key < arr[mid] )

                        {

                               right = mid-1;

                        }

                        else if ( key > arr[mid] )

                        {

                               left = mid+1;

                       }

                }

                return -1;

        }

}

作者: 王晓新    时间: 2012-6-12 23:38
{:soso_e100:}毕向东老师java基础视频中专门对折半查找做了讲解,你可以去看看
作者: 王超    时间: 2012-6-12 23:52
正确的是:
else if ( key < arr[mid] )
{
right = mid-1;  //当你要查找的数字小于第一次查找的中间值的时候,右边的范围下标就移动到中间值减1的位置,因为不包含中间值
}
else if ( key > arr[mid] )
{
left = mid+1;////当你要查找的数字大于第一次查找的中间值的时候,左边的范围下标就移动到中间值加1的位置}

作者: 葛奎    时间: 2012-6-13 00:09
class Test15
{
        public static void main(String[] args)
        {
                int arr[] = {1,3,5,6,7,9,12,24};
                //System.out.println(halfSearch( arr, 0, arr.length, 2 ));
                int num = halfSearch(arr,24);
                System.out.println(num);
        }
        
        private static int halfSearch ( int arr[], int key )
        {
                int left, right, mid;
                left = 0;
                right = arr.length - 1;        
                while ( left <=right )
                {
                        mid = ( left + right ) / 2;               
                        if ( key == arr[mid] )
                        {
                                return mid;
                        }
                        else if ( key < arr[mid] )
                        {
                                right = mid-1;
                        }
                        else if ( key > arr[mid] )
                        {
                                left = mid+1;
                        }
                }
                return -1;
        }
}
//改成这样就行了
作者: 胡大强    时间: 2012-6-13 00:16
        private static int halfSearch ( int arr[], int key )
        {
                int left, right, mid;
                left = 0;
                right = arr.length - 1;        
                while ( left < right )
                {
                        mid = ( left + right ) / 2;               
                        if ( key == arr[mid] )
                        {
                                return mid;
                        }
                        else if ( key < arr[mid] )
                        {
                                right = mid-1;
                        }
                        else if ( key > arr[mid] )
                        {
                                left = mid+1;
                        }
                }
                return -1;
        }
}

        }

很明显,当key<arr[mid],说明key在arr【mid】的左边,所以缩小范围后,最右边的right=mid-1,而不是等于mid.
kry>arr[mid]时,原理相同!







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