0

我遇到了二进制搜索的问题。

它第一次工作,但如果用户从菜单中选择此选项,它不适用于不在阵列中的度假村,有时根本不起作用。我不知道为什么它不起作用。我一直在这里阅读不同的线程来尝试弄清楚,但我很难过。

编辑:我想我让它工作了。我取出了整个代码部分并重写了它,查看最终结果的唯一区别是 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.");
            }
        }
4

1 回答 1

0

您必须在每个不匹配集或不添加或减去任何内容 的情况下初始化low-1,而不是零。lowhighmiddle

可视化lowhigh指向已检查且不可能匹配的条目。您在数组“外部”启动两个元素。当middle证明不匹配时,它替换lowhigh作为不可能匹配的条目的外部边界。

或者,您可以编写代码lowhigh表示候选范围的“内部边界”,在这种情况下,您的middle-1andmiddle+1是正确的,初始条件是low=0and high=length-1

您可以选择任一可视化,但您的起始条件(lowhigh值)不一致。

于 2013-09-25T23:16:22.263 回答