2014-05-17 122 views
-5

我试图运行此代码以使用二进制搜索来搜索名称,但它不起作用。 这段代码或方法有什么问题?使用BinarySearch进行搜索

public static int BinarySearchForStudentsName(String StudentName[],String Name) { 
    int left = 0; 
    int right = count - 1; 
    int middle; 
    while (true) { 
     middle = (left + right)/2; 
     int copmarison = Name.compareTo(StudentName[middle]); 
     if (Name.equals(StudentName[middle])) { 
      return middle; 
     } else if (left > right) { 
      return count; 
     } else { 
      if (copmarison > 0) { 
       middle = middle + 1; 
      } else { 
       middle = middle - 1; 
      } 
     } 
    } 
} 
    public static void main(String[] args) { 
String a[]={"A","B","C","D"}; 
int index = BinarySearchForStudentsName(a,"M"); 
    if (index == count) { 
     System.out.println("not found"); 
    } else { 
     System.out.println("founded at " + index); 
    } 
}} 
+0

1.数组中没有名为“Me”的值。 2.数组需要在搜索之前进行排序。 –

+0

对不起,我忘了排序数组,但同样的东西仍然无法正常工作.... 和值“ME”我想品尝它,如果它将返回找不到或不...为什么搜索? – user3648168

+0

'String StudentName []'不能正确。你的变量'copmarison'拼错了。你的变量'count'是未定义的。解决这个问题。 – user1803551

回答

0

您需要更新leftright值不是middle ..change像这样

while (true) { 
    middle = (left + right)/2; 
    int copmarison = Name.compareTo(StudentName[middle]); 
    if (Name.equals(StudentName[middle])) { 
     return middle; 
    } else if (left > right) { 
     return count; 
    } else { 
     if (copmarison > 0) { 
      left = middle + 1; 
     } else { 
      right = middle - 1; 
     } 
    } 
} 
+0

哦,你是对的非常感谢 – user3648168

0

寻找一个名字,你拿一本电话簿。在中间打开它。有3种可能性:

1)你很幸运,你找到了名字,搜索结束。

2)名称是'更大'(按字母顺序排列)。撕掉电话簿的左半部分并重新开始。

3)您正在搜索的名称是'更小'。撕掉电话簿的右半部分,重新​​开始...

代码有什么问题?

1)BinarySearch的需要排序后的数组:

String a[]={"Aureliano","Cruise","Hatchi","Zaboumba"}; 

2) '的compareTo' 的返回值应引导搜索,而不是比较作为 “左>右”。 “CompareTo”返回0,或返回< 0,或返回大于0的东西。

3)如果搜索的名称不存在,则某些时候电话簿中不会有任何页面。同样,你的代码不应该使用无限循环:而不是'while(true)',考虑一个涉及变量'left'和'right'的条件。