找到数组的中位数

时间:2014-01-31 18:19:28

标签: ruby arrays median

我写了一些代码,它返回未排序的奇数数组的中位数,但它不返回偶数数组的中位数。

我知道为了找到偶数数组的中位数,你必须得到数组的中间两个数,平均数,这就是中位数。我无法将其转换为可用的代码。除了这段代码的明显冗长之外,问题似乎是7-8行,我不明白为什么。

我更喜欢提示答案,但如果您更喜欢发布一些固定代码,我也可以接受。

def media(array)
  sorted = array.sort
  list = sorted.length
  if list %2 != 0
    (list + 1) / 2.0
  else
    even = ((list.to_f + 2) / 2) + ((list.to_f / 2)
    return (even/2)
  end
end

4 个答案:

答案 0 :(得分:4)

我将在这里找到一个解决方案......

def median(ary)
  mid = ary.length / 2
  sorted = ary.sort
  ary.length.odd? ? sorted[mid] : 0.5 * (sorted[mid] + sorted[mid - 1])
end

编辑 - 根据BroiSatse的建议,我已合并.odd?

答案 1 :(得分:1)

  a = [1,2,4,5,3,6]
  sorted = a.sort
  list = sorted.length
  if list %2 != 0
    puts sorted[list/2]
  else
    puts (sorted[list/2]+sorted[(list/2)-1])/2.0
  end

答案 2 :(得分:0)

def get_median(values)
  quotient, remainder = values.sort!.length.divmod(2)
  medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq
  medians.length > 1 ? medians.map(&:to_f).reduce(:+) / 2 : medians[0]
end

应该有效,但如果没有,请告诉我。

编辑忘记将.to_f添加到中位数值。这是我在Pry的测试。

[1] pry(main)> def get_median(values)
[1] pry(main)*   quotient, remainder = values.sort!.length.divmod(2)
[1] pry(main)*   medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq
[1] pry(main)*   medians.length > 1 ? medians.map { |v| v.to_f }.reduce(:+) / 2 : medians[0]
[1] pry(main)* end
=> nil
[2] pry(main)> values = [1,2,3]
=> [1, 2, 3]
[3] pry(main)> get_median values
=> 2
[4] pry(main)> values << 4
=> [1, 2, 3, 4]
[5] pry(main)> get_median values
=> 2.5
[6] pry(main)> get_median values << -1
=> 2
[7] pry(main)> values
=> [-1, 1, 2, 3, 4]
[8] pry(main)> values << 11
=> [-1, 1, 2, 3, 4, 11]
[9] pry(main)> get_median values << -1
=> 2
[10] pry(main)> values
=> [-1, -1, 1, 2, 3, 4, 11]
[11] pry(main)> values.delete_if { |v| v == -1}
=> [1, 2, 3, 4, 11]
[12] pry(main)> values << -1
=> [1, 2, 3, 4, 11, -1]
[13] pry(main)> get_median values
=> 2.5
[14] pry(main)>

答案 3 :(得分:0)

以下是答案:

def get_median(sub_a)
    result = -1
    size = sub_a.size
    if size == 0
        result = 0
    elsif size == 1
        result = sub_a[0]
    elsif size == 2
        result = get_average(sub_a[0], sub_a[1])
    else
        sorted_a = sub_a.sort
        index = size / 2
        if size % 2 == 0
            result = get_average(sorted_a[index - 1], sorted_a[index]);
        else 
            result = sorted_a[index];
        end
    end

    '%0.01f' % result
end