首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

求三个数据当中值

2013-11-09 
求三个数据中间值如有三个数,5 、15、 6用vB程序找出中间数6,求代码,谢了。你这个算法太神奇了,实在高!说实在

求三个数据中间值
如有三个数,5 、15、 6用vB程序找出中间数6,求代码,谢了。



你这个算法太神奇了,实在高!说实在,我还没看出是什么原理,指教指教求三个数据当中值

原理是这样的:
   k = A And (A > B) And (A < C) 
   '如果 (A > B) And (A < C) 不成立(Boolean 值 = 0)则 A 与之相与的结果为 0
   '如果 (A > B) And (A < C) 成立(Boolean 值 = -1)则 A 与之相与的结果为 A

实际上,这一句还要完善一下:
   k = A And ((A > B) And (A < C) Or (A > C) And (A < B)) 

其他两句以此类推。三句的条件都是排他的。 

[解决办法]
Private Sub Command1_Click()
   Dim A&, B&, C&
   Dim k&
   
   A = 15: B = 5: C = 6
   k = A And ((A > B) And (A < C) Or (A > C) And (A < B))
   k = k Or B And ((B > A) And (B < C) Or (B > C) And (B < A))
   k = k Or C And ((C > A) And (C < B) Or (C > B) And (C < A))
   MsgBox k, vbInformation

End Sub

[解决办法]
楼主的问题,实际上是求无序数组中位数的最简化的特例。

对于很大的数组,一般是采用部分排序法来找到中位数。无论是升序或降序的排序都可以,排到一半的时候(奇数个要加1)就得到中位数了。不需要全排序取中间数(当然,利用控件排序的情况除外)。

还有一种容易想到方法,适用于一些特定情况,就是剩余法。做 N/2 (对于偶数情况要减 1)次循环扫描,每次获取最大值和最小值。无论得到最大值或最小值,都将源元素改写为不在数据值域中的值(权且称为 Null)。最后剩下的,就是中位数。对于无法改为 Null 值的情况,则可以另外建一个表来记录已经取值的元素索引(注意,不必最大值和最小值各建一个表)。

对此方法的改进,就是只取最大或最小值,多循环一次取得的就是中位数。对于偶数个元素的情况下,如果希望将上中位数和下中位数都得到,可以再加一次循环。

热点排行