计算数组中的中位数 - 有人能告诉我这行代码中发生了什么吗?

时间:2013-05-21 06:50:52

标签: ruby median

这是计算数组中值的解决方案。我得到前三行,duh;),但第三行是魔术发生的地方。有人可以解释'sorted'变量是如何使用的以及为什么它在括号旁边,以及为什么另一个变量'len'被括在括号中然后括在括号中?它几乎就像排序一下子被用作数组?谢谢!

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

  puts median([3,2,3,8,91])
  puts median([2,8,3,11,-5])
  puts median([4,3,8,11])

3 个答案:

答案 0 :(得分:1)

考虑一下:

[1,2,2,3,4]和[1,2,3,4]。两个数组都是排序的,但分别有奇数和偶数个元素。因此,这段代码考虑了这两个案例。

sorted确实是一个数组。你排序[2,3,1,4]然后你回来[1,2,3,4]。然后计算偶数/奇数元素的中间索引(len - 1) / 2len / 2,并找出它们的平均值。

答案 1 :(得分:1)

是的,array.sort返回一个数组,并将其分配给sorted。然后,您可以通过数组索引访问它。

如果您有一个奇数个元素,比如示例中的5个元素,那么索引就是:

(len-1)/2=(5-1)/2=2

len/2=5/2=2 --- (remember this is integer division, so the decimal gets truncated)

所以你取索引2处的值并加上它们,然后除以2,这与索引2处的值相同。

如果你有偶数个元素,比如4,

(len-1)/2=(4-1)/2=1 --- (remember this is integer division, so the decimal gets truncated)

len/2=4/2=2

所以在这种情况下,你实际上是对两个中间元素1和2进行平均,这是你有一个偶数个元素的中位数的定义。

答案 2 :(得分:0)

  

它几乎就像排序一下子被用作数组?

是的,确实如此。在第2行,它被初始化为具有与输入相同元素的数组,但是按升序排列(默认排序为升序)。在第3行,你有len,它是用sorted数组的长度初始化的,所以是的,sorted从那时起被用作数组,因为它就是它。