二元搜索算法的问题

时间:2010-12-25 09:29:57

标签: c# algorithm binary-search

下面的代码属于二进制搜索算法,用户在textbox1中输入数字,并在textbox2.i中输入他想用二进制搜索的数字.i有问题,就是我在textbox1中输入例如15,21并在textbox2中输入15并将brakpoint放在我在下面评论的行上,并且我明白它不会将文本框中的数字放在searchnums中(注释),更多解释我在code.thanks中提前评论

 public void button1_Click(object sender, EventArgs e)
    {


        int searchnums = Convert.ToInt32(textBox2.Text);//the problem is here,the value in textbox2 doesnt exist in searchnums and it has value 0. 

        int result = binarysearch(searchnums);
        MessageBox.Show(result.ToString());
    }
    public int binarysearch(int searchnum)
    {
        string[] source = textBox1.Text.Split(',');
        int[] nums = new int[source.Length];
        for (int i = 0; i < source.Length; i++)
        {
            nums[i] = Convert.ToInt32(source[i]);
        }

        int first =0;

        int last = nums.Length-1;


        while (1<= nums.Length)
        {
        int mid = (int)Math.Floor(first+last / 2.0);
             if (first > last)
            {
                break;
            }
            if (searchnum < nums[mid])
            {
                last = mid - 1;
            }
            if (searchnum > nums[mid])
            {
                first = mid + 1;
            }
            else
            {
                return nums[mid];

            }
        }
        return -1; 


    }

3 个答案:

答案 0 :(得分:2)

它与二进制搜索有什么关系?问题似乎是你无法读取文本框中的数字。你确定它是正确的文本框吗?什么是文字?此外,如果将断点放在将值分配给searchnums的行上,它将为0,因为尚未分配断点,将断点放在AFTER行上。

答案 1 :(得分:2)

首先,当您知道可以在一行上放置断点时,您确定知道可以单步执行整个程序并查看每个变量或属性中的值。所以,继续,并调试。除此之外,您可能还缺少程序中的数据输入验证。

其次,在midfirst更新后,您的二进制搜索实现缺少last重新计算,如果在数组中找不到要查找的数字,则停止条件。无论first == last是否匹配,您都必须在nums[mid]的情况下中断循环 - 没有人说textbox2 中的数字必须在数组中。

答案 2 :(得分:1)

好的,首先,我希望您知道如果nums未排序,二进制搜索将无效。

也就是说,算法中存在一些问题。首先,您不会更改循环中的任何关键元素。您只是在循环中更改firstlast并且它们甚至不在那里使用,因此循环的状态不会更改。

所以我想你的意思是在循环的开头有这一行:

mid = (first +last)/2;

除此之外,您还需要检查该号码不存在的可能事件。这意味着在循环开始时将其添加到:

if (last < first) break;

这当然意味着数组块的第一个点已经过了最后一个点,这意味着块大小为负数。当你到达阵列中的最后一个单元格时,first == last可能是合法的。

最后一点是将last作为size-1启动:

int last = nums.Length - 1;

毕竟我们正在讨论数组索引。