脑力挑战:随机产生五个数,求中间数(即大小排在中间的这个数),要求只能用6次比较

jhyu 2002-05-12 12:36:57
随机产生五个数,求中间数(即大小排在中间的这个数),要求只能用6次比较
...全文
215 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
starfish 2002-06-07
  • 打赏
  • 举报
回复
To: jjjj2345(牧人)
我的方法没有问题
当第四步为:

100 50
| \
52 1
|
51

时, 比较50和52,第五步得到

100
|
52
| \
51 50
|
1

即第5步右边的情况
然后比较50和51,得到
100
|
52
|
51
|
50
|
1

即第6步的第3种情况,显然中间的51就是中位数。
jhyu 2002-06-07
  • 打赏
  • 举报
回复
星哥的解答太理论化了,所以没有给全分,呵呵
clickx(zzz)的是正确的
zengj 2002-05-27
  • 打赏
  • 举报
回复
我觉得只是一个数学问题:
首先求平均值,然后找出这五个数与那个平均值的差的绝对值的最小数,好像只用5次比较,不知道是不是这样
wiely 2002-05-27
  • 打赏
  • 举报
回复
这是WinerTree N个节点需要N-1次排序。
superzjx2000 2002-05-26
  • 打赏
  • 举报
回复
设为d1 d2 d3 d4 d5
d1:d2(假设d1〉d2)
d3:d4(假设d3〉d4)

d1:d4
"<" d5:d1 get it
else
d3:d2
"<" d5;d3 get it
else
(d1 d3)>(d2 d4)
d5 is the answer


clickx 2002-05-25
  • 打赏
  • 举报
回复
有趣的题目,我也来试一下:
假设有a1,a2,a3,a4,a5五个数
1.a1和a2比较,设较小这为a12,a3和a4比较,设较小者为a34
2.a12和a34比较,较小者为a
这时首先得出结论:a不是中间数。因为a比a1,a2,a3,a4中的其中三个数小。不失一般性,可以假设a1<a2,a3<a4,a1<a3,(可以在比较时交换a1,a2,a3,a4的值使这几个不等式成立)这时a=a1。剩下的问题可以转为如何通过三次比较找出a2,a3,a4,a5的第二小的那个数。需要注意的是这时a3和a4的大小关系在前面的比较中已经确定,在余下的比较中可以直接利用。由上面可以假设a3<a4。算法继续进行:
3.比较a2和a5,较小者为a25
4.比较a25和a3。
5.如果a25<a3,则a25不是所求的数。因为a25小于a3,a4(a3<a4)以及a2和a5中的较大者。同样a4也不是所求的数,因为a4大于a3和a25。故所求的数只能是a3或a2与a5的较大一个数。通过一次比较找出这两个数的较小一个就是所求的中间数,这时共计比较了6次。
6.如果a25>a3,a3不是所求的数。因为a3小于a25,a4以及a2和a5中的较大者。a2和a5的较大者也不是所求的数,因为a2和a5的较大者大于a3和a25。故所求的数只能是a25和a4。比较a25和a4较小的一个即为所求的中间数。这时共计也比较了6次

例如上面的例子1 2 4 5 3
比较1和2,4和5得出较小者为1和4,比较1和4较小者为1。把1排除,剩下4个数:2,4,5,3。这时已经知道4<5。继续比较2和3得出2<3。比较2和4得出2<4。有第5步排除2和5,剩下3和4比较可知3为所求。共比较了6次。

不知上面的方法有无错漏处?

ahahai 2002-05-25
  • 打赏
  • 举报
回复
(1)A,B,C,D四位随机数字进行四次比较排序:
A>B..C>D..\A>C..\C<B //=A>B>C>D
...\C>B //=A>C>B>D
...\A<C..\A<D //=C>D>A>B
...\A>D //=C>A>D>B
(2)假设四次比较得随机数字的序列为:A>B>C>D
A>B>C>D..\C>E //=C
...\C<E..\B>E //=E
...\B<E //=B
(3)逐次类推。
lizhongkun 2002-05-25
  • 打赏
  • 举报
回复
假如用递归,并且递归中的比较不算,那4次就可以了,呵呵!!
int f(&a,&b,&c,&d,&e){
m=a>b?(b>c?(c>d?(d>e?c:f(a,b,c,e,d)):f(a,b,d,c,e)):f(a,c,b,d,e)):f(b,a,c,d,e);
return m;
}
birdflash 2002-05-25
  • 打赏
  • 举报
回复
确实没有错漏,佩服!
very good!
jjjj2345 2002-05-25
  • 打赏
  • 举报
回复
TO clickx(zzz)
你的方法应该对的, 我找不出什么错漏处!
jjjj2345 2002-05-24
  • 打赏
  • 举报
回复
冒泡法好象也不行!
jjjj2345 2002-05-24
  • 打赏
  • 举报
回复
to melice(melice)
6:b?e
如果b>e:mid=b
但是b<e:mid就确定不了到底是e还是c了

to starfish(海星)
我感觉你的第四步的第一种情况有问题
如果是下面的情况:
100 50
| \
52 1
|
51

则6种的
* *
\ /
x
/ \
* *

中的X就不是中间值了。

zjssoft 2002-05-24
  • 打赏
  • 举报
回复

m=e>(a>b?a:b)?e:(a>b?a:b;);
max=m>(c>d?c:d)?m:(c>d?c:d);
ahahai 2002-05-24
  • 打赏
  • 举报
回复
1..
a>b
c>d
e<b..e>c //=e
2..
a>b
c>d
e<b..e<c..b>c //=c
3..
a>b
c>d
e<b..e<c..b<c //=b
4..
a>b
c>d
e>b..b>c //=b
5..
a>b
c>d
e>b..b<c..e>c //=c
6..
a>b
c>d
e>b..b<c..e<c //=e
最多只需要5次。
jjjj2345 2002-05-24
  • 打赏
  • 举报
回复
to ahahai(死掉了)
光看结果,就知道是错的了
你的结果中只有b,c,e有可能是中间值。
其实a 和d也有可能是中间值的
3..
a>b
c>d
e<b..e<c..b<c //=b
不能得出是b,还有可能是d,a

下面的也一样



melice 2002-05-13
  • 打赏
  • 举报
回复
设5个数字是:a,b,c,d,e
1: a ? b ,设 a<b
2: c ? d ,设 c<d
3,4,5: abcd排序,
其实前面的5步就是分段排序。
6 : b?e
b<e : mid =e
b>e : mid =b
melice 2002-05-13
  • 打赏
  • 举报
回复
to starfish:
第三步,再考虑一下好么。
melice 2002-05-13
  • 打赏
  • 举报
回复
to moonese:
1 2 4 5 3
chenggn 2002-05-12
  • 打赏
  • 举报
回复
依照前面得出的结果。。。。
chenggn 2002-05-12
  • 打赏
  • 举报
回复
(((c-d)-(a-b))-e) 然后。。。。


加载更多回复(6)

33,006

社区成员

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

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