当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : C语言二分查找迷糊了,该从哪里跳出循环?
帖子发表于 : 2016-02-14 5:05 

注册: 2013-05-26 6:58
帖子: 2157
系统: Debian 9
送出感谢: 893
接收感谢: 30
C语言二分查找迷糊了,该从哪里跳出循环?
和大多数例子不同的是,我这里用的是unsigned而非int
和大多数例子另一个更重要的不同是:
这个二分查找函数在查找失败时还兼有返回一个适当插入位置的任务
具体迷糊的地方见代码注释
代码:
//二分搜索,0表示最小元素
//high等于最大可用下标
//本函数二分查找网址字符串
//bsr是二分查找结果
void
my_bsearch (unsigned low, unsigned high, bsrtype * const bsr)
{
  //中间位置
  unsigned mid;
  //最低位置
  unsigned const lowest = low;
  //最高位置
  unsigned const highest = high;
  bsr->found_site = UINT_MAX;
  bsr->new_site = UINT_MAX;
  assert (high < UINT_MAX);
  int my_compar_rsult = 0;
  if (url_total == 0)
    {
      bsr->new_site = 0;
      return;
    }
  while (low <= high)
    {
      mid = low + ((high - low) / 2U);

      my_compar_rsult = my_compar (mid);
      if (my_compar_rsult == 0)
   {
     bsr->found_site = mid;
     bsr->new_site = mid;
     return;
   }
      //子表为空则直接跳出循环
      else if (low == high)
   {         //该从这里跳出?
     //这里跳出可以确定无错误,但是否多余的进行了一次比较?
     break;
   }
      else if (my_compar_rsult < 0)
   {
     if (lowest == mid)
       break;
     high = mid - 1U;
   }
      else if (my_compar_rsult > 0)
   {
     if (highest == mid)
       break;
     low = mid + 1U;
   }
      //子表为空则直接跳出循环
      if (low == high)
   {         //该从这里跳出?这里跳出是否会漏掉一次应该进行的比较?
     break;
   }
    }
  //"已找到串"设置为空串
  found_string = my_realloc (found_string, 0);
  //判断新元素插入位置
  if (my_compar_rsult < 0)
    bsr->new_site = mid;
  else
    bsr->new_site = mid + 1U;
  return;
}


页首
 用户资料  
 
2 楼 
 文章标题 : Re: C语言二分查找迷糊了,该从哪里跳出循环?
帖子发表于 : 2016-02-19 13:24 
头像

注册: 2008-09-18 13:11
帖子: 2781
送出感谢: 1
接收感谢: 453
第一处:后面多余的比较一大堆,何必在乎这一处
第二处:会。如在{0,1}中查找2



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
3 楼 
 文章标题 : Re: C语言二分查找迷糊了,该从哪里跳出循环?
帖子发表于 : 2016-02-19 17:18 

注册: 2013-05-26 6:58
帖子: 2157
系统: Debian 9
送出感谢: 893
接收感谢: 30
astolia 写道:
第一处:后面多余的比较一大堆,何必在乎这一处
第二处:会。如在{0,1}中查找2

第一处后面的比较真的是"多余"?
代码:
my_compar_rsult = my_compar (mid);

使用my_compar_rsult比较只是在内存中比较变量,但是如果进入到下一轮循环,就需要调用my_compar (mid)这个访问外存的函数来获取文件中的字符串比较信息
my_compar (mid)实际上是比较用户输入的字符串和索引中的第mid个字符串
因为用户输入的字符串被声明为全局标识符,所以没有出现在本段代码中.


页首
 用户资料  
 
4 楼 
 文章标题 : Re: C语言二分查找迷糊了,该从哪里跳出循环?
帖子发表于 : 2016-02-20 14:03 
头像

注册: 2008-09-18 13:11
帖子: 2781
送出感谢: 1
接收感谢: 453
科学之子 写道:
第一处后面的比较真的是"多余"?
我就举一个,你说判断 my_compar_rsult > 0 是不是多余?



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 0 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译