Ответ 1
Вот решение, которое работает как на четном, так и на нечетном массиве и не будет изменять массив:
def median(array)
sorted = array.sort
len = sorted.length
(sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
Как вычислить медиану массива чисел с помощью Ruby?
Я начинающий и в процессе моего обучения я стараюсь придерживаться того, что уже было изучено. Таким образом, другие вопросы, которые я нашел, выходят за рамки моих возможностей.
Вот мои заметки и моя попытка:
берут среднее значение этих двух средних чисел.
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
Вот решение, которое работает как на четном, так и на нечетном массиве и не будет изменять массив:
def median(array)
sorted = array.sort
len = sorted.length
(sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
Если при вычислении медианы вы имеете в виду 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]
Подобно nbarraille, но мне немного легче отслеживать, почему это работает:
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
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
def median(array)
half = array.sort!.length / 2
array.length.odd? ? array[half] : (array[half] + array[half - 1]) / 2
end
* Если длина четная, вы должны добавить среднюю точку плюс среднюю точку - 1 для учета индекса, начинающегося с 0
Я думаю, это хорошо:
#!/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, а не сортировку, потому что это быстрее: Сортировка массива в порядке убывания в Ruby.