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);