Java 二进制搜索-错误

Java 二进制搜索-错误,java,binary,binary-tree,binary-search-tree,binary-search,Java,Binary,Binary Tree,Binary Search Tree,Binary Search,我有一份学生名单,我想按姓氏对他们进行排序。 学生名单看起来有点像这样: Amanda Dorris Tucker Yasmin Zara 我想使用二进制搜索方法来搜索这些学生并输出所需的结果 这就是我到目前为止所做的: public void binarySearch(String keyword) { int output; if (fileSorted == false) { System.out.println("The file " + fileN

我有一份学生名单,我想按姓氏对他们进行排序。 学生名单看起来有点像这样:

Amanda
Dorris
Tucker
Yasmin
Zara
我想使用二进制搜索方法来搜索这些学生并输出所需的结果

这就是我到目前为止所做的:

public void binarySearch(String keyword) {

    int output;

    if (fileSorted == false) {
        System.out.println("The file " + fileName + " is not sorted. Please wait while it gets sorted...");
        bubbleSort();
        System.out.println("Thank you for your patience.");
        System.out.println();
        System.out.print("Search for: ");
        keyword = elmo.nextLine();
        output = doBinarySearch(keyword);
    } else {
        output = doBinarySearch(keyword);
    }
    System.out.println(output);
}

public int doBinarySearch(String keyword) {

    int start = 0;
    int end = numStudents - 1;
    int mid;
    int result;

    while (start < end) {
        mid = start + (end - start) / 2;
        result = students[mid].returnLastName().compareToIgnoreCase(keyword);

        if (result == 0) {
            return mid;
        } else if ((end - start) <= 1 ) {
            return -1;
        } else if (result > 0) {
            start = mid;
        } else if (result < 0) {
            end = mid;
        }
    }
    return -1;
}
公共void二进制搜索(字符串关键字){
整数输出;
if(fileSorted==false){
System.out.println(“文件“+fileName+”未排序。正在排序,请稍候…”);
泡泡运动();
System.out.println(“感谢您的耐心。”);
System.out.println();
系统输出打印(“搜索:”);
关键字=elmo.nextLine();
输出=doBinarySearch(关键字);
}否则{
输出=doBinarySearch(关键字);
}
系统输出打印项次(输出);
}
public int-doBinarySearch(字符串关键字){
int start=0;
int end=numStudents-1;
int mid;
int结果;
while(开始<结束){
mid=开始+(结束-开始)/2;
结果=学生[mid].returnLastName().compareToIgnoreCase(关键字);
如果(结果==0){
中途返回;
}else if((结束-开始)0){
开始=中间;
}否则如果(结果<0){
结束=中间;
}
}
返回-1;
}

不要在循环条件中使用不等式--
while(start!=end)
--使用
while(start
。当你测试是否相等时,你假设
开始
结束
在每次迭代中只改变一次,这可能不一定是真的

mid = ((end - start) / 2);
这是错误的。您需要将
mid
设置为
start
end
的中点,以便

mid = start + (end - start) / 2;

如果你不怕溢出

根据您所拥有的,
mid
始终位于数组的前半部分

还有,你有你的箱子

    } else if (result > 0) {
        start = mid;
    } else if (result < 0) {
        end = mid;
    }

学生[mid]
的姓氏在词典中大于
关键字时返回一个正数,因此您需要更改
结束
,而不是
开始

发生了什么事,这不是您所期望的?换句话说,问题具体是什么?System.out.println(输出);不给我输出。程序死亡:(什么是“程序死亡”?通常您会收到一条包含有价值信息的异常消息。请发布它。在我输入关键字后,带有错误的stacktrace将是有用的,我没有从程序得到任何回复…很容易理解,如果数据没有被标记为以前按
文件排序的方式进行排序,那么数据将在
泡泡排序中进行排序。我们不希望这里有几百行代码。我同意
while(start
更合适。我同意,并编辑了我的答案。我只是关心数据在进入搜索方法之前发生了什么。有趣的是,我修复了mid错误。我该如何修复我的案例?只需交换比较。你也可以使用
mid-1
mid+1
,否则如果(结果<0){start=mid+1;}否则{end=mid-1;}
因为您知道
mid
不是正确的索引。如果(结束-开始我同意Daniel Fisher的答案。也可以检查你的while循环,因为这可能不会检查数据中的姓氏。太棒了。现在对我来说这真的很有意义!但是有一件事困扰着我,第一个元素Amanda,最后一个元素zara,在我搜索时没有被输出。剩下的是g哦。
    } else if (result > 0) {
        start = mid;
    } else if (result < 0) {
        end = mid;
    }
result = students[mid].returnLastName().compareToIgnoreCase(keyword);