一个关于“折半算法”的基本问题

qingtianheshang 2009-09-10 10:51:09
题目:
对于长度为18的有序顺序表,若采用折半查找,则查找15个元素的查找次数为( )
答案:4次
但是我却得到了2个答案,恳请热心人帮忙指教。


假如,数字为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18

我用两个方法,但得到了两个方法。


方法1:
步骤1:首先,将数字1和18相加,接着(1+18)/2=9.5
步骤2:然后,观察9和9.5接近,所以 (9+17)/2=13
步骤3:接着,观察14和13.5接近,所以,(13+16)/2=14.5
步骤4:最后,观察是15
结论:4次就查找到了数字15。


方法2:
步骤1:首先,将数字1和18相加,接着(1+18)/2=9.5
步骤2:然后,观察10和9.5接近,所以(10+17)/2=13.5
步骤3:接着,观察14和13.5接近,所以,(14+16)/2=15

结论:3次就查找到了数字15。



我的疑问就是:是“方法1,和方法2”中的步骤2,和9.5比较的数字,一个是9,一个是10,它们都相差

0.5,那么,结论就不同,还是我的方法错误了,恳请热心人帮忙指教,并指导正确的算法,谢谢)





...全文
213 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
AR_X 2009-09-11
  • 打赏
  • 举报
回复
刚好打酱油路过,学习了
liuxiaobing2008 2009-09-11
  • 打赏
  • 举报
回复
支持3楼
Blacking 2009-09-11
  • 打赏
  • 举报
回复
方法1就不对,9已经是不可能的值了,怎么还要算里边!3楼正解
KWHOK 2009-09-11
  • 打赏
  • 举报
回复
^^
绿色夹克衫 2009-09-11
  • 打赏
  • 举报
回复
应该不会超过5次!
warm_gan 2009-09-11
  • 打赏
  • 举报
回复
同意3楼
qingtianheshang 2009-09-11
  • 打赏
  • 举报
回复
我已经将解释抄下,回去我再好好琢磨琢磨,谢谢
xiaoshi935 2009-09-11
  • 打赏
  • 举报
回复
发现3楼的解答是正确的,我就没必要罗嗦了
zhengyanming3 2009-09-11
  • 打赏
  • 举报
回复
计算机里整数相除是没有小数的,只得整数.
步骤1:首先,low = 1,high =18,接着(1+18)/2=9, mid = 9,15>mid.
步骤2:然后,low = 9+1,high =18,所以(10+18)/2=14, mid = 14,15>mid
步骤3:接着,low = 14+1,high =18,所以,(15+18)/2=16,mid=16, 15<mid
步骤4:接着,low = 15,high =16-1,所以,(15+15)/2=15,mid=15, 15==mid

结论:4次就查找到了数字15。
zeroieme 2009-09-11
  • 打赏
  • 举报
回复
有序的查找第N个不是直接定位o(0)吗?
feixian49 2009-09-11
  • 打赏
  • 举报
回复
楼主的两个方法都有问题,折半怎么折,设下标从 low 到 high
则分做两半:[low...int((low+high)/2)] 和 [int((low+high)/2)+1...high]
所以,下表从0到17,找第十四个元素
1: [0+17]/2=8<14
2: [9+17]/2=13<14
3: [14+17]/2=15>14
4: [14+14]/2=14
xiaoshi935 2009-09-10
  • 打赏
  • 举报
回复
MARK一下,明天看。
PeacefulBY 2009-09-10
  • 打赏
  • 举报
回复
好吧首先我默认你的题要找的是第15个元素而不是15个元素
然后折半是比大小不是看那个接近
步骤1:(1+18)/2 = 9.5 < 15,所以接下来找[10,18]区间
步骤2:(10+18)/2 = 14 < 15,所以接下来找[14,18]区间
步骤1:(14+18)/2 = 16 > 15,所以接下来找[14,16]区间
步骤1:(14+16)/2 = 15 = 15,done

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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