Вычисление медианы - EcsFlash/DataTypes GitHub Wiki
Реализация:
func partition(arr []int, low, high int) ([]int, int) {
pivot := arr[high]
i := low
for j := i; j < high; j++ {
if arr[j] < pivot {
arr[i], arr[j] = arr[j], arr[i]
i++
}
}
arr[i], arr[high] = arr[high], arr[i]
return arr, i
}
func FindMedian(arr []int) int {
return findMedian(arr, len(arr)/2, 0, len(arr)-1)
}
func findMedian(arr []int, k int, low, high int) int {
var p int
arr, p = partition(arr, low, high)
if p < k {
return findMedian(arr, k, p+1, high)
} else if p > k {
return findMedian(arr, k, low, p-1)
} else {
return arr[p]
}
}
ДАННОЕ РЕШЕНИЕ НАХОДИТ МЕДИАНУ ТОЛЬКО ДЛЯ МАССИВА НЕЧЕТНОЙ ДЛИНЫ. ЕСЛИ ДАН МАССИВ ЧЕТНОЙ ДЛИНЫ, ТО:
func FindMedian(arr []int) float64 {
return (findMedian(arr, len(arr)/2, 0, len(arr)-1) + findMedian(arr, len(arr)/2 - 1, 0, len(arr)-1)) / 2.0
//то есть как оно и есть на самом деле, в случае четной длины медиана равна среднему из двух центральных
}