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

这是用于计算arrays中的中值的解决方案。 我得到前三行,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]) 

考虑一下:

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

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

是的,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行,它被初始化为具有与输入相同元素的数组,但是按升序排列(默认排序为升序)。 在第3行,你有len ,它是用已sorted数组的长度初始化的,所以是的, sorted从那时起被用作数组,因为它就是这样。