package 二分查找法;
import java.util.ArrayList;
import java.util.Scanner;
public class Application {
public static void main(String args[]){
System.out.println("输入一段数组,输入0结束输入:");
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
ArrayList<Integer>list=new ArrayList<Integer>();
while(m!=0){
list.add(m);
m=sc.nextInt();
}
int a[] = new int[list.size()];
for (int i =0; i<list.size();i++) {
a[i] = list.get(i);
}
Application qs=new Application();
qs.sort(a,0,a.length-1);
System.out.println("排序结果如下:");
qs.print(a);
System.out.println("请输入要查找的数:");
Scanner reader=new Scanner(System.in);
int x=reader.nextInt();
if(qs.BinarySeach(a, x)>=0){
System.out.println("该查找数所在数组中的下标:"+qs.BinarySeach(a, x));}
if(qs.BinarySeach(a, x)<0) {
System.out.println("查找不到该数,该数组中小于x的最大元素位置是:"+qs.BinarySeachFailI(a, x));
System.out.println("查找不到该数,该数组中大于x的最小元素位置是:"+qs.BinarySeachFailJ(a, x));
}
}
public void print(int[]a){
for(int i=0;i<a.length;i++){
if(i==a.length-1){
System.out.print(a[i]+"\n");
}
else{
System.out.print(a[i]+",");
}
}
}
public void sort(int []a,int left,int right){
int i=left;
int j=right;
if(i>j){
return ;
}
int key=a[left];
while(true){
while(j>i){
if(a[j]<key){
int temp=a[j];
a[j]=a[i];
a[i]=temp;
break;
}
else{
j--;
}
}
while(j>i){
if(a[i]>key){
int temp=a[j];
a[j]=a[i];
a[i]=temp;
break;
}
else{
i++;
}
}
if(j==i){break;}
}
sort(a,left,i-1);
sort(a,i+1,right);
}
public int BinarySeach(int []a,int x){
int left=0;
int right=a.length-1;
while(left<=right){
int middle=(left+right)/2;
if(x==a[middle])return middle;
if(x>a[middle])left=middle+1;
else right=middle-1;
}
return -1;
}
public int BinarySeachFailI(int []a,int x){ //小于x的最大元素位置i
int m=0;
for(int i=a.length;i>=0;i--){
if(a[i]<x)m=i;
break;
}
return m;
}
public int BinarySeachFailJ(int []a,int x){ //大于x的最小元素位置j
int k=0;
for(int j=0;j<=a.length;j++){
if(a[j]>x)k=j;
break;
}
return k;
}
}
代码如上,要求如下,键盘输入一串数组,先进行排序,再改写二分搜索算法,使得当X不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
就是当所查找的数不在数组中的时候,怎样都调试不出来,求大神解答。或者给个方案,因为我就是不知道怎样在一个方法中既返回middle同时又要返回left跟right,才改写出这样的代码。
------解决思路----------------------
你用eclipse吗,如果不用的话,抓紧上网找找,安上一个.学会查看错误堆栈.
有两个错误:1.数组长度长度不能大于等于array.length,因为下表从0开始的.2.在写 if 的时候,按照最佳实践,在后面加上对应对额大括号.你把代码两个方法这么改一下就行了.另外,还有很大的提升空间,加油吧.
public int BinarySeachFailI(int[] a, int x) { // 小于x的最大元素位置i
int m = 0;
for (int i = a.length - 1; i >= 0; i--) {
if (a[i] < x) {
m = i;
break;
}
}
return m;
}
public int BinarySeachFailJ(int[] a, int x) { // 大于x的最小元素位置j
int k = 0;
for (int j = 0; j <= a.length - 1; j++) {
if (a[j] > x) {
k = j;
break;
}
}
return k;
}
------解决思路----------------------
你可以返回一个数组啊,比如a[0]表示left,a[1]表示middle,a[2]表示right,你也可以建一个结果类,这个结果类有数据域left, middle, right ,那么返回的时候,可以返回这个类的对象,你同样可以一次性取到3个数