0

这种二分搜索适用于所有字符串,除了带有空格的字符串。NameBox.Text 是提供搜索输入的地方。关键是在 Namebox 中搜索一个标题,并在“Game”中读取它,这是一个字符串列表框,然后如果找到了游戏,则使用游戏数据填充 NameBox、PlatformBox 和 CostBox 字段。

private void BinarySearch_Click(object sender, EventArgs e)   
{
    if (String.IsNullOrEmpty(NameBox.Text))
    {
        log.Items.Clear();
        log.Items.Add("Please enter a string");
        return;
    }
    int min = 0;
    int max = Game.Length - 1;
    string search = NameBox.Text;
    while (min <= max)
    {
        int mid = (min + max) / 2;
        if (Game[mid] == search)
        {
            log.Items.Clear();
            log.Items.Add("Game " + Game[mid] + " found!");
            NameBox.Text = Game[mid];
            PlatformBox.Text = Platform[mid];
            String cost1 = Cost[mid].ToString("$0.00");
            CostBox.Text = cost1;
            NameBox.Focus();
            return;
        }
        else if (Game[mid] != search)
        {
            max = mid - 1;
        }
        else 
        {
            min = mid + 1;
        }
    }
    log.Items.Clear();
    log.Items.Add("Game not found");
    NameBox.Focus();
}
4

1 回答 1

0

改变你else if的阅读方式

else if (Game[mid].CompareTo(search)>0)

目前,你else if和你的else有效是一回事。二进制搜索需要对已排序的数据进行操作,它需要检查中间值并确定“这是小于、等于还是大于我正在寻找的数据”——这是三个问题

现在你的代码只问了两个问题:“它是一样的,否则不一样,否则[它不一样]”

CompareTo 将确定“如果中点的值按字母顺序大于搜索”,这意味着您可以知道您寻找的值在数组的下半部分,您可以减少最大值

这使得逻辑三状态(如果找到,否则如果正在寻找的术语在数组的下部减少最大值,否则术语必须在上部所以提高最小值)

它在这里工作,在以下位置查找带有空格的数据:https ://dotnetfiddle.net/dE5wdw

于 2021-04-11T05:06:07.017 回答