求三个数据中间值,该如何处理
求三个数据中间值
如有三个数,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))
其他两句以此类推。三句的条件都是排他的。
------解决方案--------------------
------解决方案--------------------
楼主的问题,实际上是求无序数组中位数的最简化的特例。
对于很大的数组,一般是采用部分排序法来找到中位数。无论是升序或降序的排序都可以,排到一半的时候(奇数个要加1)就得到中位数了。不需要全排序取中间数(当然,利用控件排序的情况除外)。
还有一种容易想到方法,适用于一些特定情况,就是剩余法。做 N/2 (对于偶数情况要减 1)次循环扫描,每次获取最大值和最小值。无论得到最大值或最小值,都将源元素改写为不在数据值域中的值(权且称为 Null)。最后剩下的,就是中位数。对于无法改为 Null 值的情况,则可以另外建一个表来记录已经取值的元素索引(注意,不必最大值和最小值各建一个表)。
对此方法的改进,就是只取最大或最小值,多循环一次取得的就是中位数。对于偶数个元素的情况下,如果希望将上中位数和下中位数都得到,可以再加一次循环。
如有三个数,5 、15、 6用vB程序找出中间数6,求代码,谢了。
------解决方案--------------------
三个数可以这样算:
Private Sub Command1_Click()
Dim A&, B&, C&
Dim k&
A = 5: B = 15: C = 6
k = A And (A > B) And (A < C)
k = k Or B And (B > A) And (B < C)
k = k Or C And (C > A) And (C < B)
MsgBox k, vbInformation
End Sub
------解决方案--------------------
原理是这样的:
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 值的情况,则可以另外建一个表来记录已经取值的元素索引(注意,不必最大值和最小值各建一个表)。
对此方法的改进,就是只取最大或最小值,多循环一次取得的就是中位数。对于偶数个元素的情况下,如果希望将上中位数和下中位数都得到,可以再加一次循环。