Вычисление медианы - EcsFlash/DataTypes GitHub Wiki

image image image image

Реализация:

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
//то есть как оно и есть на самом деле, в случае четной длины медиана равна среднему из двух центральных
}