找到数组的中位数

我写了一些代码,它返回未排序的奇数编号数组的中位数,但它不返回偶数数组的中位数。

我知道为了找到偶数数组的中位数,你必须得到数组的中间两个数,平均数,这就是中位数。 我无法将其转换为可用的代码。 除了这段代码的明显冗长之外,问题似乎是7-8行,我不明白为什么。

我更喜欢提示答案,但如果您更喜欢发布一些固定代码,我也可以接受。

def media(array) sorted = array.sort list = sorted.length if list %2 != 0 (list + 1) / 2.0 else even = ((list.to_f + 2) / 2) + ((list.to_f / 2) return (even/2) end end 

我打算在这里找到一个解决方案……

 def median(ary) mid = ary.length / 2 sorted = ary.sort ary.length.odd? ? sorted[mid] : 0.5 * (sorted[mid] + sorted[mid - 1]) end 

编辑 – 我已经合并了.odd? 根据BroiSatse的建议。

  a = [1,2,4,5,3,6] sorted = a.sort list = sorted.length if list %2 != 0 puts sorted[list/2] else puts (sorted[list/2]+sorted[(list/2)-1])/2.0 end 
 def get_median(values) quotient, remainder = values.sort!.length.divmod(2) medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq medians.length > 1 ? medians.map(&:to_f).reduce(:+) / 2 : medians[0] end 

应该有效,但如果没有,请告诉我。

编辑忘了将.to_f添加到中位数值。 这是我在Pry的测试。

 [1] pry(main)> def get_median(values) [1] pry(main)* quotient, remainder = values.sort!.length.divmod(2) [1] pry(main)* medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq [1] pry(main)* medians.length > 1 ? medians.map { |v| v.to_f }.reduce(:+) / 2 : medians[0] [1] pry(main)* end => nil [2] pry(main)> values = [1,2,3] => [1, 2, 3] [3] pry(main)> get_median values => 2 [4] pry(main)> values << 4 => [1, 2, 3, 4] [5] pry(main)> get_median values => 2.5 [6] pry(main)> get_median values << -1 => 2 [7] pry(main)> values => [-1, 1, 2, 3, 4] [8] pry(main)> values << 11 => [-1, 1, 2, 3, 4, 11] [9] pry(main)> get_median values << -1 => 2 [10] pry(main)> values => [-1, -1, 1, 2, 3, 4, 11] [11] pry(main)> values.delete_if { |v| v == -1} => [1, 2, 3, 4, 11] [12] pry(main)> values << -1 => [1, 2, 3, 4, 11, -1] [13] pry(main)> get_median values => 2.5 [14] pry(main)> 

这是答案:

 def get_median(sub_a) result = -1 size = sub_a.size if size == 0 result = 0 elsif size == 1 result = sub_a[0] elsif size == 2 result = get_average(sub_a[0], sub_a[1]) else sorted_a = sub_a.sort index = size / 2 if size % 2 == 0 result = get_average(sorted_a[index - 1], sorted_a[index]); else result = sorted_a[index]; end end '%0.01f' % result end