module Nuggets::Array::MedianMixin

Public Instance Methods

median([prefer]) → anObject click to toggle source
median { |left, right| ... } → anObject

Determines the median of the values in array. array must be sortable.

If array contains an even number of values, a block may be passed to decide what the “middle” (average) should be. For Numeric values, the block is optional and the arithmetic mean will be used when no block is passed; for other values, the block is mandatory.

Alternatively, prefer may either be set to true, 1, or :left to use the left “middle”, or to false, 2, or :right to use the right “middle”. The block will then be ignored.

   # File lib/nuggets/array/median_mixin.rb
46 def median(prefer = nil)
47   return if empty?
48 
49   sorted, index = sort, (size / 2.0).ceil - 1
50 
51   case prefer
52     when true,  1, :left  then prefer_left  = true
53     when false, 2, :right then prefer_right = true
54   end
55 
56   middle1 = sorted[index]
57   return middle1 if prefer_left || size.odd?
58 
59   middle2 = sorted[index + 1]
60   return middle2 if prefer_right
61 
62   unless block_given?
63     # simple arithmetic mean
64     (middle1 + middle2) / 2.0
65   else
66     # make your own average
67     yield middle1, middle2
68   end
69 end