- private void button1_Click(object sender, EventArgs e)
- {
-
- int[] a = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};//数组
- int key = int.Parse(txtKey.Text);//找到要搜索的那个KEY
- int location = BindarySearch(a, key);//位置
- s.Text += "位置"+location;
- if (location == -1)
- {
- s.Text += "未发现";
- }
-
- }
- public int BindarySearch(int[] array, int key)//返回所在的位置
- {
- int low = 0, high = array.Length - 1;
- int middle;
- while (low <= high)
- {
- middle = (low + high) / 2;
-
- if (array[middle] == key)
- {
- return middle;
- }
- else if (array[middle] > key)
- {
- high = middle - 1;
- }
- else
- {
- low = middle + 1;
- }
- s.Text += middle.ToString()+" ";
- }
- return -1;
- }
-
复制代码 折半法查找元素在数组中的位置,在
“middle = (low + high) / 2;
if (array[middle] == key)
{
return middle;
}
else if (array[middle] > key)
{
high = middle - 1;
}
else
{
low = middle + 1;
}
”
刚开始我想,把high往后延长一个,low往前一格
“这样计算也增加不了很多,更加严谨”,可是我发现我犯了一个致命的错误,比方一个1-17的数组,如果我想查找16这个数
因为我的大方,问题来了,中间值是14,然后low=middle-1;那么low又成13了,(13+16)/2=14
噢啦陷入死循环了!其实我前面设置了一道官桥,不相等才能往下判断,这个扩大范围其实不必要{:soso_e114:}写代码必须严谨
|