二进制搜索 - 错误

时间:2013-06-15 22:59:18

标签: 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 " + 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;
}

2 个答案:

答案 0 :(得分:2)

该行

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

错了。您需要将mid设置为(大致)startend的中点,所以

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

mid = (end + start) / 2;

如果你不害怕溢出。

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

另外,你有案例

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

错误。

result = students[mid].returnLastName().compareToIgnoreCase(keyword);
students[mid]的姓氏按字典顺序大于keyword时,

会返回正数,因此您需要更改end,而不是start

答案 1 :(得分:0)

不要在循环条件中使用不等式 - while (start != end) - 使用while (start < end)This is the typical approach。当你测试相等性时,你假设startend在每次迭代中只改变一个,这可能不一定是真的。