java二分查找

来源:百度知道 编辑:UC知道 时间:2024/06/03 07:21:43
import java.util.*;
public class SortFind {

/**
* Creates a new instance of <code>SortFind</code>.
*/
public SortFind() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int n=0,start,end,middle;
int a[]={12,34,9,-23,45,6,45,90,123,19,34};
Arrays.sort(a);
System.out.printf("a[0]=%-3d a[1]=%-3d a[2]=%-3d a[4]=%-3d a[5]=%-3d a[6]=%-3d a[7]=%-3d a[8]=%-3d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
Scanner reader =new Scanner(System.in);
while(reader.hasNextInt()){
n=reader.nextInt();
start=0;
end=a.length;
middle=(start+end)/2;
int count=0;
while(n!=a[middle]){
if(n>a[middle])
start=middle;
else

我大概看了一下,找出了你2个重要的缺点.
第一,你用一个5个数的小数组挨个按你写的算法算一下,你会发现很多地方是a.length-1而非a.length,有的地方是==,而不是>.
其中还有2个小地方.
if(count>a.length/2) break;
可以写成while(reader.hasNextInt()&&count<a.length/2).
3.else if(n<a[middle]) 可以写成 else.
第二,是最重要的问题.算法上面.
试想一下如果只有2个数.start是0,end是1,给出的数是a[end],用你的if(n>a[middle]) start=middle;0.5取0,永远start,middle都是0.如果你说因此你用a.length而不是减1,那a[start]就永远也取不到。
怎么解决,加一个如果middle=(start+end)/2后等于start且不为0的话,start取end.