修改一下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]);
}
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]);
}
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);
}
int high=num.length 这样会不会下标越界啊?这个程序是找出和用户输入相似的两个数,数组是随机产生的浮点数。我就没明白如何去进行一个比较,我想是不是要用到Math.ceil这样的方法啊????
middle作下标不会越界。你原先就错在判断比较何时结束上:if (key==Math.ceil(num[middle]))很难恰好满足,也就无打印结果。
我这里是二分查找法,查到无法再分了,也就比较结束了,所以加了:
if (exitFlag == middle){
break;
}
这个时候结果就不是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]);
}
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]));
}
如果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];不知道想法对不对,望指正!
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");
} }
}
}
把我调试通过的源代码发在下面,希望大家指教。
程序中还有很多不完善的地方,对于异常的处理也很粗略,不过我想对于和我一样的新手应该会有一定的启发。。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");
} }
}
}
{
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");
} }
}
}
帮你调试过