修改一下search()方法:

public static void search(double d,double[] num)
{
int low=0;
int middle=0;
int middle1=0;
int high=num.length;
double key=d;
int exitFlag = 0;

while (low<=high)
{
middle=(low+high)/2;
if (exitFlag == middle){
break;
}
exitFlag = middle;
if (key<=num[middle])
high=middle;
else
low=middle;

}
System.out.println(num[middle]);
middle1=middle+1;
System.out.println(num[middle1]);
}

解决方案 »

  1.   

    帮你改了一下方法,不过是用递归实现的public static void search(
    double d,
    double[] num,
    int Maxlength,//数组的长度
    int Minlength) {
    int m = (Maxlength + Minlength) / 2;
    if (Minlength > Maxlength)
     {
    System.out.println(num[m] + "," + num[m + 1]);
    return;
     } 
       else 
       if (d == Math.ceil(num[m]))
       {
    System.out.println(num[m] + "," + num[m + 1]);
       }
          else 
          if (d > num[m]) 
             {
              search(d,num,Maxlength, m + 1 );
             } 
               else
           search(d,num, m - 1,Minlength);
    }
      

  2.   

    rower203(华仔):
    int high=num.length    这样会不会下标越界啊?这个程序是找出和用户输入相似的两个数,数组是随机产生的浮点数。我就没明白如何去进行一个比较,我想是不是要用到Math.ceil这样的方法啊????
      

  3.   

    high 是用在middle=(low+high)/2;
    middle作下标不会越界。你原先就错在判断比较何时结束上:if (key==Math.ceil(num[middle]))很难恰好满足,也就无打印结果。
    我这里是二分查找法,查到无法再分了,也就比较结束了,所以加了:
    if (exitFlag == middle){
    break;
    }
      

  4.   

    有没有想过一种情况是:输入数字为4,随机数中升序有:3.1、4.1、4.2。
    这个时候结果就不是4的前一个跟后一个了。
    是否考虑将数组先减4取绝对,然后找最小的两个位置。
    public void search(double[] numX)
    {
    //循环每一个元素,每次循环找到数组中未排序的元素
    //中最小的一个,把它移动到最前面
    int min=0; //保存最小元素的索引号
                      int min2;
    //查找i到数组最后一个元素中最小的元素
    for (int j=0;j<numX.length;j++)
    {
    if (numX[j]<numX[min])
    min=j;
    }
    if((numX[min-1]-numX[nim])<(numX[min+1]-numX[nim]))
        nim2=nim-1;
                      else
                          nim2=nim+1;
             System.out.println(num[nim]);
             System.out.println(num[nim2]);
    }
      

  5.   

    上面的numX是已经减过4的数组,num是排序后的数组。
      

  6.   

    在search()方法的最后加上一句就可以了:
    public static void search(double d,double[] num)
    {
    int low=0;
    int middle=0;
    int middle1=0;
    int high=num.length;
    double key=d;
    int exitFlag = 0;

    while (low<=high)
    {
    middle=(low+high)/2;
    if (exitFlag == middle){
    break;
    }
    exitFlag = middle;
    if (key<=num[middle])
    high=middle;
    else
    low=middle;

    }
    System.out.println(num[middle]);
    middle1=middle+1;
    System.out.println(num[middle1]);
    System.out.println("The data I wanted is: " + ((d-num[middle]) > (num[middle1] - d)? num[middle1]: num[middle]));
    }
      

  7.   

    monkeyK(影子星) 说得对,我后来也想了这个问题。确实应该减完了以后再比较。不过有一点,一个排好序的数组的每个元素减去同一个数不需要再排序了吧!那现在的问题就归结成了一个如何在减完后的数组中去寻找那个最接近于0的数不知道我这样的想法是否正确。。
      

  8.   

    monkeyK(影子星) 说得对!我觉得先对num升序排序,然后比较num[0],num[num.length-1]同Key的大小
    如果num[0]>Key,则num[0]为离Key最近的大数,无离Key最近的小数。
    如果num[num.length-1]<Key,则num[length-1]为离Key最近的小数,无离Key最近的大数。再二分查找到num[middle] (rower203(华仔):的方法不错),然后讨论num[middle]是比Key大还是小。就可确定另一个离Key最近的数是num[middle-1]还是num[middle+1];不知道想法对不对,望指正!
      

  9.   

    在综合大家的意见后我重新改了程序,但我发现在进行两个浮点数的比较的过程中出现了问题。无论我输入什么数字都会让循环进行到最后,没有进入我想象的分支。。请大家帮忙指点一下关于浮点数的比较问题代码如下
    import java.io.*;/**
     * 对100个随机浮点数排序,然后交互的让用户输入一个数
     * 打印出数组中离这个数最近的大数和小数
     * 使用二分查找法。
    **/public class SortNumbers
    {
    public static double[] sort(double[] num)
    {
    //循环每一个元素,每次循环找到数组中未排序的元素
    //中最小的一个,把它移动到最前面
    for (int i=0;i<num.length;i++)
    {
    int min=i; //保存最小元素的索引号
    //查找i到数组最后一个元素中最小的元素
    for (int j=i;j<num.length;j++)
    {
    if (num[j]<num[min])
    min=j;
    }
    //将i与最小元素交换
    //这样就排序成功了
    double tmp;
    tmp=num[i];
    num[i]=num[min];
    num[min]=tmp;

    }
    return num;
    }

    public static void search(double d,double[] num)
    {
    int low=0;
    int high=num.length-1;
    int middle=0;
    int middle1=0;
    int middle2=0;
    boolean key=true;
    while(low<=high)
    {
    if (d<num[0])
    {
    System.out.println("输入的数是数组中最小的一个");
    break;
    }
    if (d>num[num.length-1])
    {
    System.out.println("输入的数是数组中最大的一个");
    break;
    } middle=(low+high)/2;
    middle1=middle+1;
    middle2=middle-1;
    if ((num[middle]-d)>0)
    {
    if ((d-num[middle2])>0)
    {
    break;
    }
    else
    low=middle+1;
    }
    else
    {
    if ((num[middle1]-d)>0)
    {
    key=false;
    break;
    }
    else
    high=middle-1;
    }

    }
    if (key)
    {
    System.out.println(num[middle2]);
    System.out.println(num[middle]);
    }
    else
    {
    System.out.println(num[middle]);
    System.out.println(num[middle1]);
    }
    }

    public static void main(String[] args) throws IOException
    {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    double[] num=new double[100];
    for (int i=0;i<num.length;i++)
    {
    num[i]=Math.random()*1000;
    }
    num=sort(num);
    for (int i=0;i<num.length;i++)
    {
    System.out.print(num[i]+" ");
    }
    System.out.println();
    for (;;)
    {
    System.out.print("num>");
    String line=in.readLine();
    if ((line==null)||(line.equals("quit")))
    break;
    try
    {
    double d=Double.parseDouble(line);
    search(d,num);
    }
    catch (Exception e)
    {
    System.out.println("Invalid Input");
    } }

    }
    }
      

  10.   

    感谢各位大侠的指教,问题我已经解决了
    把我调试通过的源代码发在下面,希望大家指教。
    程序中还有很多不完善的地方,对于异常的处理也很粗略,不过我想对于和我一样的新手应该会有一定的启发。。import java.io.*;/**
     * 对100个随机浮点数排序,然后交互的让用户输入一个数
     * 打印出数组中离这个数最近的大数和小数
     * 使用二分查找法。
    **/public class SortNumbers
    {
    public static double[] sort(double[] num)
    {
    //循环每一个元素,每次循环找到数组中未排序的元素
    //中最小的一个,把它移动到最前面
    for (int i=0;i<num.length;i++)
    {
    int min=i; //保存最小元素的索引号
    //查找i到数组最后一个元素中最小的元素
    for (int j=i;j<num.length;j++)
    {
    if (num[j]<num[min])
    min=j;
    }
    //将i与最小元素交换
    //这样就排序成功了
    double tmp;
    tmp=num[i];
    num[i]=num[min];
    num[min]=tmp;

    }
    return num;
    }

    public static void search(double d,double[] num)
    {
    int low=0;
    int high=num.length-1;
    int middle=0;
    int middle1=0;
    int middle2=0;
    boolean key=true;
    while(low<=high)
    {
    if (d<num[0])
    {
    System.out.println("输入的数是数组中最小的一个");
    break;
    }
    if (d>num[num.length-1])
    {
    System.out.println("输入的数是数组中最大的一个");
    break;
    } middle=(low+high)/2;
    middle1=middle+1;
    middle2=middle-1;
    if (d<num[middle])
    {
    if (d>num[middle2])
    {
    break;
    }
    else
    high=middle-1;
    }
    else
    {
    if (d<num[middle1])
    {
    key=false;
    break;
    }
    else
    low=middle+1;
    }

    }
    if (key)
    {
    System.out.println(num[middle2]);
    System.out.println(num[middle]);
    }
    else
    {
    System.out.println(num[middle]);
    System.out.println(num[middle1]);
    }
    }

    public static void main(String[] args) throws IOException
    {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    double[] num=new double[100];
    for (int i=0;i<num.length;i++)
    {
    num[i]=Math.random()*1000;
    }
    num=sort(num);
    for (int i=0;i<num.length;i++)
    {
    System.out.print(num[i]+" ");
    }
    System.out.println();
    for (;;)
    {
    System.out.print("num>");
    String line=in.readLine();
    if ((line==null)||(line.equals("quit")))
    break;
    try
    {
    double d=Double.parseDouble(line);
    search(d,num);
    }
    catch (Exception e)
    {
    System.out.println("Invalid Input");
    } }

    }
    }
      

  11.   

    import java.io.*; public class SortNumbers
    {
    public static double[] sort(double[] num)
    {
    //循环每一个元素,每次循环找到数组中未排序的元素
    //中最小的一个,把它移动到最前面
    for (int i=0;i<num.length;i++)
    {
    int min=i; //保存最小元素的索引号
    //查找i到数组最后一个元素中最小的元素
    for (int j=i;j<num.length;j++)
    {
    if (num[j]<num[min])
    min=j;
    }
    //将i与最小元素交换
    //这样就排序成功了
    double tmp;
    tmp=num[i];
    num[i]=num[min];
    num[min]=tmp;

    }
    return num;
    }

    public static void search(double d,double[] num)
    {
         int low=0;
         int middle=0;
         int middle1=0;
         int high=num.length-1;
         double key=d;
         int exitFlag = 0; 
       if (d<num[0])
        {
          System.out.println("输入的数是数组中最小的一个");
     
        }
       else if (d>num[num.length-1])
        {
           System.out.println("输入的数是数组中最大的一个");
     
        }
               else
                 {
            while (low<=high)
    {
    middle=(low+high)/2;
    if (exitFlag == middle)
                            {
    break;
    }
    exitFlag = middle;
    if (key<=num[middle])
    high=middle;
    else
    low=middle;

    }

                      if(num[middle]<d)
                         {
                        
                         System.out.println("The data is:"+num[middle]+"\n"+num[middle+1]);
                         }           
                      else if(num[middle]>d)
                          { 
                               System.out.println("The data is:"+num[middle-1]+"\n"+num[middle]);
                           }                 
                       else                                                          /*d 和其中数相等*/
            {
                          System.out.println("The data you input equals "+num[middle]);  /*再比较num[middle-1]和num[middle+1]*/
    }
            }
         } 
    public static void main(String[] args) throws IOException
    {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    double[] num=new double[100];
    for (int i=0;i<num.length;i++)
    {
    num[i]=Math.random()*1000;
    }
    num=sort(num);
    for (int i=0;i<num.length;i++)
    {
    System.out.print(num[i]+" ");
    }
    System.out.println();
    for (;;)
    {
    System.out.print("num>");
    String line=in.readLine();
    if ((line==null)||(line.equals("quit")))
    break;
    try
    {
    double d=Double.parseDouble(line);
    search(d,num);
    }
    catch (Exception e)
    {
    System.out.println("Invalid Input");
    } }

    }
    }
    帮你调试过