下面的代码属于二进制搜索算法,用户在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;
}
答案 0 :(得分:2)
它与二进制搜索有什么关系?问题似乎是你无法读取文本框中的数字。你确定它是正确的文本框吗?什么是文字?此外,如果将断点放在将值分配给searchnums的行上,它将为0,因为尚未分配断点,将断点放在AFTER行上。
答案 1 :(得分:2)
首先,当您知道可以在一行上放置断点时,您确定知道可以单步执行整个程序并查看每个变量或属性中的值。所以,继续,并调试。除此之外,您可能还缺少程序中的数据输入验证。
其次,在mid
或first
更新后,您的二进制搜索实现缺少last
重新计算,如果在数组中找不到要查找的数字,则停止条件。无论first == last
是否匹配,您都必须在nums[mid]
的情况下中断循环 - 没有人说textbox2
中的数字必须在数组中。
答案 2 :(得分:1)
好的,首先,我希望您知道如果nums
未排序,二进制搜索将无效。
也就是说,算法中存在一些问题。首先,您不会更改循环中的任何关键元素。您只是在循环中更改first
和last
并且它们甚至不在那里使用,因此循环的状态不会更改。
所以我想你的意思是在循环的开头有这一行:
mid = (first +last)/2;
除此之外,您还需要检查该号码不存在的可能事件。这意味着在循环开始时将其添加到:
if (last < first) break;
这当然意味着数组块的第一个点已经过了最后一个点,这意味着块大小为负数。当你到达阵列中的最后一个单元格时,first == last
可能是合法的。
最后一点是将last
作为size-1启动:
int last = nums.Length - 1;
毕竟我们正在讨论数组索引。