二分查找只有要查的元素位于中间时才能成功

sukekiyo 2009-03-24 03:57:17
如题,当查找别的位置上时都失败


template<typename Pointer, typename T>
bool _binary_search(Pointer first, Pointer last, const T& value)
{
last -= 1;
//std::cout << *last;
while(first < last)
{
Pointer middle = first + (last - first) / 2;
if (value < *middle)
{
last = middle - 1;
}
else if(*middle < value)
{
first = middle + 1;
}
else
{
return true; //value == *middle
}
}
return false;
}
...全文
156 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangshuiling 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 sukekiyo 的帖子:]
如题,当查找别的位置上时都失败


C/C++ code
template<typename Pointer, typename T>
bool _binary_search(Pointer first, Pointer last, const T& value)
{
last -= 1;
//std::cout << *last;
while(first < last)
{
Pointer middle = first + (last - first) / 2;
if (value < *middle)
{
last = middle - 1;
}
else if(*middle …
[/Quote]
while(first < last) 改while(first<=last)
极有可能first==last时元素相等
bfhtian 2009-03-24
  • 打赏
  • 举报
回复
Pointer是指针吗,相加会产生什么结果?
sukekiyo 2009-03-24
  • 打赏
  • 举报
回复
刚刚还是弄错了
sukekiyo 2009-03-24
  • 打赏
  • 举报
回复
last指向区间最后一个元素的后面一个位置,现在明白了要改为 last += 1;
downmooner 2009-03-24
  • 打赏
  • 举报
回复
int a[10]={0,1,2,3,4,5,6,7,8,9};
bool find(int first,int end,int v)
{
while (first<=end)
{
int temp=first+(end-first)/2;
if (a[temp]==v)
{
return true;
}
else if (a[temp]<v)
{
end=temp-1;
}
else
first=temp+1;
}
return false;
}
icecools 2009-03-24
  • 打赏
  • 举报
回复
为什么要这句?
last -= 1;
smaltdd 2009-03-24
  • 打赏
  • 举报
回复
Pointer middle = first + (last - first) / 2;


first 和last是表示位置的,怎么能给查询的对象赋值呢?
downmooner 2009-03-24
  • 打赏
  • 举报
回复
last -= 1; 这里为什么-1呢?


while(first <= last)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧