A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪振 中级黑马   /  2013-3-13 15:18  /  1237 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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:}写代码必须严谨

评分

参与人数 1技术分 +1 黑马币 +32 收起 理由
张文 + 1 + 32

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马