2013-02-13 37 views
38

Rubyを使用して数値の配列の中央値を計算するにはどうすればよいですか?Rubyの中央値の計算

私は初心者であり、学習の進展の中で、私はすでに教えられていることに固執しようとしています。したがって、私が見つけた他の質問は私の範囲外です。

  1. ソート昇順に配列:ここで

    は私のノートと私の試みです。
  2. 長さが奇数か偶数かを判断します。
  3. の場合は、ソートされた配列の長さ+1を半分に分割します。その は中央値のインデックスです。この値を返します。
  4. でも、ソートされた配列の真ん中の2つの番号を見つけ出し、それらを1/2で分割します。 この値を返します。
  5. 真中の2つの数字を見つける:
  6. ソートされた配列の長さを半分に分割します。これはインデックスptです。最初のミドルナンバー。
  7. は、ソートされた配列の長さ+2を半分に分割します。これはインデックスptです。秒の中間の数字の
  8. これらの2つの中間の数字の平均をとってください。

    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 
    
+2

実際の質問は何ですか? –

+1

ここに質問があります:数値の配列を入力として取り、中央値を返すメソッド中央値を書いてください。 – tomgalpin

+1

私は*あなたの*質問を意味しました。質問をするときに、何が起こるべきか、何が起こっているのか、期待から逸脱していること、そして何を試みたのかを説明する必要があります。 –

答えて

69

は、両方の偶数と奇数の長さの配列上で動作し、配列を変更することはありませんソリューションです。

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

それは参考になります。ありがとう。私はこれを理解しています。 – tomgalpin

+0

'class array def median sorted = self.sort ... end end' ...' [3,1,4,1,6] .median' –

2

中央値を算出することで、あなたはthis

を意味する場合は、ここで

a = [12,3,4,5,123,4,5,6,66] 
a.sort! 
elements = a.count 
center = elements/2 
elements.even? ? (a[center] + a[center+1])/2 : a[center] 
+1

偶数長の配列では機能しません。 – Reactormonk

+0

ええ、偶数番号であれば、それは...私が今までに学んだことの中でifプロシージャになります – tomgalpin

+0

if/elseを持っている必要はありません、 – nbarraille

-2

I tそれは良いことだヒンク:

#!/usr/bin/env ruby 

#in-the-middle value when odd or 
#first of second half when even. 
def median(ary) 
    middle = ary.size/2 
    sorted = ary.sort_by{ |a| a } 
    sorted[middle] 
end 

または

#in-the-middle value when odd or 
#average of 2 middle when even. 
def median(ary) 
    middle = ary.size/2 
    sorted = ary.sort_by{ |a| a } 
    ary.size.odd? ? sorted[middle] : (sorted[middle]+sorted[middle-1])/2.0 
end 

それは高速ですので、私はむしろ、ソートよりsort_byを使用:Sorting an array in descending order in Ruby

1
nbarraille年代に似

、私はそれが少し簡単にこの1つは働く理由を追跡するために見つける:

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 

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 
0
def median(array) 
    half = array.sort!.length/2 
    array.length.odd? ? array[half] : (array[half] + array[half - 1])/2 
end 

*長さが偶数の場合は、中間点に加えて中間点を追加する必要があります - 1をアカウントにインデックスに対して0

+0

'array.sort! 'を使用しているので、それは良い考えではありませんパラメータを変更します – RainChen

1
def median(array)       #Define your method accepting an array as an argument. 
     array = array.sort      #sort the array from least to greatest 
     if array.length.odd?     #is the length of the array odd? 
     return array[(array.length - 1)/2] #find value at this index 
     else array.length.even?    #is the length of the array even? 
     return (array[array.length/2] + array[array.length/2 - 1])/2.to_f 
              #average the values found at these two indexes and convert to float 
     end 
    end 
で始まります
+0

これを行うには多くの方法がありますが、答えは最もエレガントです。何が起こっているかは非常に明確です。 – SeattleDucati

+0

array.lengthが奇数でない場合、偶数であるか、他の何かである可能性がありますか?else elseの後の式も必要ですか? –

関連する問題