我遇到二进制搜索问题。
它第一次工作但是如果用户从菜单中选择此选项,则它不适用于不在阵列中的度假村,有时根本不起作用。我无法弄清楚它为什么不起作用。我一直在阅读不同的主题,试图弄明白但是我很难过。
编辑:我认为我得到了它的工作。我拿出了代码的全部内容并重写了唯一的区别,看看最终结果是if else if语句中的括号 if (resorts[middle].getName().compareTo(getDataFor) > 0)
{
high = middle - 1;
}
else if (resorts[middle].getName().compareTo(getDataFor) < 0)
{
low = middle + 1;
}
else
{
resorts[middle].display();
found = true;
}
感谢您的帮助!
else if (choice == '2')
{
found = false;
while (!found)
{
System.out.print("Which resort would you like data for?: ");
getDataFor = kb.nextLine().toUpperCase();
low = 0;
high = resorts.length;
while (low <= high && !found)
{
middle = (high + low) / 2;
if (resorts[middle].getName().compareTo(getDataFor) > 0)
high = middle - 1;
else if (resorts[middle].getName().compareTo(getDataFor) < 0)
low = middle + 1;
else
{
resorts[middle].display();
found = true;
}
}
if (!found)
System.out.println("Resort not found, please try again.");
}
}
答案 0 :(得分:0)
您必须将low
初始化为-1
,而不是零,并且必须将每个非匹配集low
或high
初始化为middle
,而无需添加或减去任何内容。
将low
和high
视为指向已经过检查且无法匹配的条目。您在阵列“外部”启动一个元素。当middle
证明不匹配时,它会将low
或high
替换为无法匹配的条目的外部界限。
或者,您可以编写代码low
和high
代表候选范围的“内部边界”,在这种情况下,您的middle-1
和middle+1
将是正确,初始条件为low=0
和high=length-1
。
您可以选择可视化,但您的起始条件(low
和high
值)不一致。