在Ruby中计算中位数

如何计算使用Ruby的数字数组的中位数?

我是一个初学者,在我学习的过程中,我试图坚持已经教过的东西。 因此,我发现的其他问题超出了我的范围。

这是我的笔记和我的尝试:

  1. 按升序对数组进行sorting。
  2. 弄清楚它是奇数还是长度。
  3. 如果奇数,则将sorting后的数组长度+1分成两半。 这是中位数的指数。 返回这个值。
  4. 如果偶数,则findsorting数组的中间两个数字,并将它们分成1/2。 返回这个值。
  5. find中间两个数字:
  6. 将sorting后的数组长度减半。 这是指数点。 第一个中间数字。
  7. 将sorting后的数组长度+ 2分成两半。 这是指数点。 第二个中间数字。
  8. 取这两个中间数的平均值。

    def median(array) ascend = array.sort if ascend % 2 != 0 (ascend.length + 1) / 2.0 else ((ascend.length/2.0) + ((ascend.length + 2)/2.0) / 2.0) end end 

这是一个对偶数和奇数长度数组都有效的解决scheme,不会改变数组:

 def median(array) sorted = array.sort len = sorted.length (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0 end 

如果通过计算中位数你是这个意思

然后

 a = [12,3,4,5,123,4,5,6,66] a.sort! elements = a.count center = elements/2 elements.even? ? (a[center] + a[center+1])/2 : a[center] 

与nbarraille类似,但是我发现跟踪为什么这个工作起来要容易一些:

 class Array def median sorted = self.sort half_len = (sorted.length / 2.0).ceil (sorted[half_len-1] + sorted[-half_len]) / 2.0 end end 

half_len =数组元素(包含奇数个元素的数组)的数组中间数。

更简单:

 class Array def median sorted = self.sort mid = (sorted.length - 1) / 2.0 (sorted[mid.floor] + sorted[mid.ceil]) / 2.0 end end 
  def median(array) #Define your method accepting an array as an argument. array = array.sort #sort the array from least to greatest if array.length.odd? #is the length of the array odd? return array[(array.length - 1) / 2] #find value at this index else array.length.even? #is the length of the array even? return ( array[array.length/2] + array[array.length/2 - 1] )/2.to_f #average the values found at these two indexes and convert to float end end 
 def median(array) half = array.sort!.length / 2 array.length.odd? ? array[half] : (array[half] + array[half - 1]) / 2 end 

*如果长度是偶数,则必须添加中间点加中间点 – 1以考虑从0开始的索引

我认为这很好:

 #!/usr/bin/env ruby #in-the-middle value when odd or #first of second half when even. def median(ary) middle = ary.size/2 sorted = ary.sort_by{ |a| a } sorted[middle] end 

要么

 #in-the-middle value when odd or #average of 2 middle when even. def median(ary) middle = ary.size/2 sorted = ary.sort_by{ |a| a } ary.size.odd? ? sorted[middle] : (sorted[middle]+sorted[middle-1])/2.0 end 

我使用sort_by而不是sorting,因为它更快: 在Ruby中按降序排列数组 。