在Ruby中计算中位数

tom*_*pin 44 ruby median

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

我是初学者,在学习的过程中,我正努力坚持已经教过的东西.因此,我发现的其他问题超出了我的范围.

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

  1. 按升序对数组进行排序.
  2. 弄清楚它是奇数还是长度.
  3. 如果是奇数,则将排序后的数组长度+1分成两半.这是中位数的指数.返回此值.
  4. 如果是偶数,找到排序数组的中间两个数字并将其除以1/2.返回此值.
  5. 找到中间的两个数字:
  6. 将排序后的数组长度分成两半.这是指数pt.第一个中间数字.
  7. 将排序的数组长度+ 2分成两半.这是指数pt.第二个中间数字.
  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
    
    Run Code Online (Sandbox Code Playgroud)

nba*_*lle 85

这是一个适用于偶数和奇数长度数组的解决方案,不会改变数组:

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

  • @ArtemKalinchuk 为什么是 0?对于空数组,中位数未定义。我同意应该改进这个方法来处理这种情况,要么返回类似“Float::NAN”的东西,要么引发一个自定义的、更明确的错误。 (2认同)

Kal*_*Kal 8

与 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)