我有一份学生名单,我想用姓氏对它们进行排序。 学生名单看起来有点像这样:
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;
}
答案 0 :(得分:2)
该行
mid = ((end - start) / 2);
错了。您需要将mid
设置为(大致)start
和end
的中点,所以
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。当你测试相等性时,你假设start
和end
在每次迭代中只改变一个,这可能不一定是真的。