黑马程序员技术交流社区

标题: 程序员不能瞎大方 [打印本页]

作者: 汪振    时间: 2013-3-13 15:18
标题: 程序员不能瞎大方
  1.   private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             
  4.             int[] a = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};//数组
  5.             int key = int.Parse(txtKey.Text);//找到要搜索的那个KEY

  6.             int location = BindarySearch(a, key);//位置
  7.             s.Text += "位置"+location;
  8.             if (location == -1)
  9.             {
  10.                 s.Text += "未发现";
  11.             }
  12.             

  13.         }
  14.         public int BindarySearch(int[] array, int key)//返回所在的位置
  15.         {
  16.             int low = 0, high = array.Length - 1;
  17.             int middle;
  18.             while (low <= high)
  19.             {
  20.                 middle = (low + high) / 2;
  21.                
  22.                 if (array[middle] == key)
  23.                 {
  24.                     return middle;
  25.                 }
  26.                 else if (array[middle] > key)
  27.                 {
  28.                     high = middle - 1;
  29.                 }
  30.                 else
  31.                 {
  32.                     low = middle + 1;
  33.                 }

  34.                 s.Text += middle.ToString()+" ";
  35.             }
  36.             return -1;
  37.         }
  38.      
复制代码
折半法查找元素在数组中的位置,在
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:}写代码必须严谨





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2